如何正确地将unsigned char数组转换为uint32_t

时间:2011-08-14 19:51:42

标签: c casting

所以,我正在尝试将unsigned char的数组转换为uint32_t,但每次都会得到不同的结果:

unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};;
uint32_t num = (uint32_t*)&buffer;

现在,我一直收到这个警告:

  

警告:初始化从指针生成整数而没有强制转换

当我将num更改为*num时,我没有收到警告,但这实际上并不是真正的问题(更新:嗯,那些可能现在与之相关我想到了。),因为每次运行代码都有不同的结果。其次,num,一旦它正确投射,应该是128,但如果我需要更改缓冲区的字节顺序,我可以设法自己做,我想

谢谢!

6 个答案:

答案 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;