如何正确地将unsigned char数组转换为uint32_t

omn*_*nse 12 c casting

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

unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};;
uint32_t num = (uint32_t*)&buffer;
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

cni*_*tar 18

你试过这个吗?

num = (uint32_t)buffer[0] << 24 |
      (uint32_t)buffer[1] << 16 |
      (uint32_t)buffer[2] << 8  |
      (uint32_t)buffer[3];
Run Code Online (Sandbox Code Playgroud)

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

施放char指针并将其解释为更大的东西真的不安全.有些机器期望指向整数的指针.


R..*_*R.. 8

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

uint32_t num;
memcpy(&num, buffer, 4);
Run Code Online (Sandbox Code Playgroud)

或者申请ntohlcnicutar的答案.任何基于类型惩罚的方法都是错误和危险的.