c/c++语言开发共享如何正确地将unsigned char数组转换为uint32_t

所以,我正在尝试将unsigned char的数组转换为uint32_t ,但每次都会得到不同的结果:

 unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};; uint32_t num = (uint32_t*)&buffer; 

现在,我一直收到这个警告:

警告:初始化从指针生成整数而不进行强制转换

当我将num更改为*num我没有得到那个警告,但这实际上并不是真正的问题( 更新:嗯,现在我认为它们可能是相关的。),因为每次运行代码都有不同结果 。 其次,一旦它正确投射,它应该是128 ,但是如果我需要改变缓冲区的字节顺序,我可以设法自己做, 我想

谢谢!

    你试过这个吗?

     num = (uint32_t)buffer[0] << 24 | (uint32_t)buffer[1] << 16 | (uint32_t)buffer[2] << 8 | (uint32_t)buffer[3]; 

    这样你就可以控制字节序和诸如此类的东西。

    抛出一个char指针并将其解释为更大的东西真的不安全。 有些机器希望指向整数的指针。

    假设您需要特定的固定字节顺序,cnicutar的答案是最好的。 如果你想要主机端,请尝试:

     uint32_t num; memcpy(&num, buffer, 4); 

    或者将ntohl应用于cnicutar的回答。 任何基于类型惩罚的方法都是错误和危险的。

    首先,你想说num = *(uint32_t *)&buffer

    要更改字节顺序,可以使用bswap_32(在linux,byteswap.h中)或OSSwapInt64(在osx,libkern / OSByteOrder.h中)之类的调用。

    借用@ Mr. R.上面的方法,我将一个结构中的3字节大端无符号字符数组转换为小字节无符号整数的方法…

     struct mystruct { int stuff; int stuff2; unsigned char x[3] // big endian } mystruct z; unsigned int y // little endian memcpy(&y, z->x, 3); y=be32toh(y<<8);` 

      以上就是c/c++开发分享如何正确地将unsigned char数组转换为uint32_t相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549462.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐