C ++将char []从网络转换为主机顺序并分配给unsigned int

时间:2016-11-30 16:27:21

标签: c++ char byte unsigned-integer endianness

我有一个以网络字节顺序排列的字符数组。我正在尝试将存储在indices [4-7]中的字符转换为主机顺序,并将其分配给unsigned int。我有以下功能:

unsigned int parse_num_bytes(char buf[]){ 
  unsigned int num_bytes = ((unsigned int)buf[7] << 24) | ((unsigned int)buf[6] << 16) | ((unsigned int)buf[5] << 8) | (unsigned int)buf[4];
  return num_bytes;
}

从GDB(实际上是LLDB,因为我在Mac上)我可以看到该操作生成了正确的结果,但在赋值后,该值是错误的:

   81
   82   unsigned int parse_num_bytes(char buf[]){
   83     unsigned int num_bytes = ((unsigned int)buf[7] << 24) | ((unsigned int)buf[6] << 16) | ((unsigned int)buf[5] << 8) | (unsigned int)buf[4];
-> 84     return num_bytes;
   85   }
(lldb) p num_bytes
(unsigned int) $0 = 4294967170
(lldb) p ((unsigned int)buf[7] << 24) | ((unsigned int)buf[6] << 16) | ((unsigned int)buf[5] << 8) | (unsigned int)buf[4]
(unsigned int) $1 = 2434

为了澄清,2434是正确的值。

这是我生成网络排序的地方(在服务器应用程序中):

return_buf[4] = index & 0xff;
return_buf[5] = (index >> 8) & 0xff;
return_buf[6] = (index >> 16) & 0xff;
return_buf[7] = (index >> 24) & 0xff;

从GDB我可以向你展示索引的价值(它是unsigned int

   142    return_buf[4] = index & 0xff;
   143    return_buf[5] = (index >> 8) & 0xff;
   144    return_buf[6] = (index >> 16) & 0xff;
-> 145    return_buf[7] = (index >> 24) & 0xff;
   146
   147    in_file.close();
   148    Rio_writen(connfd, return_buf, MAXLINE);
(lldb) p index
(unsigned int) $0 = 2434

1 个答案:

答案 0 :(得分:0)

猜猜您的char类型已签名,因此它可以包含负值。那些不能很好地转换为unsigned int

您可能希望将unsigned char用于缓冲区类型。