[英]How to properly convert an unsigned char array into an uint32_t
因此,我正在尝试将unsigned char
数组转换为uint32_t
,但每次都会得到不同的结果:
unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};;
uint32_t num = (uint32_t*)&buffer;
现在,我不断收到此警告:
警告:初始化使 integer 从没有强制转换的指针
当我将num
更改为*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 中)之类的调用
发出警告是因为&buffer
产生一个指向指针的指针。 即使没有引用运算符&
警告也不会消失,因为转换仅更改指针类型。 指针进一步转换为 integer 并因此发出警告。
如果字节序不重要,那么在我看来,显而易见的解决方案
unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};
uint32_t num = *(uint32_t *)buffer;
这意味着取消对 char 数组的强制转换指针的引用。
借用@ 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);`
假设它是相同的字节序,工会将是最好的选择。
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.