繁体   English   中英

如何正确地将无符号字符数组转换为 uint32_t

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM