所以,我正在尝试将unsigned char
的数组转换为uint32_t
,但每次都会得到不同的结果:
unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};;
uint32_t num = (uint32_t*)&buffer;
现在,我一直收到这个警告:
警告:初始化从指针生成整数而没有强制转换
当我将num
更改为*num
时,我没有收到警告,但这实际上并不是真正的问题(更新:嗯,那些可能现在与之相关我想到了。),因为每次运行代码都有不同的结果。其次,num
,一旦它正确投射,应该是128
,但如果我需要更改缓冲区的字节顺序,我可以设法自己做,我想。
谢谢!
答案 0 :(得分:17)
你试过这个吗?
num = (uint32_t)buffer[0] << 24 |
(uint32_t)buffer[1] << 16 |
(uint32_t)buffer[2] << 8 |
(uint32_t)buffer[3];
这样你可以控制字节顺序等等。
施放char
指针并将其解释为更大的指针真的不安全。有些机器希望指向整数的指针。
答案 1 :(得分:7)
cnicutar的答案是最好的,假设你想要一个特定的固定字节序。如果您想要主机端,请尝试:
uint32_t num;
memcpy(&num, buffer, 4);
或将ntohl
应用于cnicutar的回答。任何基于类型惩罚的方法都是错误的和危险的。
答案 2 :(得分:3)
首先,您想说num = *(uint32_t *)&buffer
要更改字节顺序,可以使用bswap_32(在linux,byteswap.h中)或OSSwapInt64(在osx,libkern / OSByteOrder.h中)之类的调用
答案 3 :(得分:0)
从上面的@ [ref]借用我的方法,将结构中的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);`
答案 4 :(得分:0)
发出警告是因为&buffer
产生了一个指向指针的指针。即使没有引用运算符&
,警告也不会消失,因为强制转换仅更改了指针类型。指针将进一步转换为整数,因此将转换为警告。
如果字节序不重要,在我看来显而易见的解决方案
unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};
uint32_t num = *(uint32_t *)buffer;
表示将转换的指针取消引用到char数组。
答案 5 :(得分:0)
假设工会的忍耐力相同,那么这将是最好的选择。
union
{
uint32_t u32;
float flt;
uin8_T bytes[4];
} converter;
//使用上述联合
converter.bytes = your_byte_array;
uint32_t u32_output = converter.u32;
float float_output = converter.flt;