如何正确地将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);`