所以,我正在尝试将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