C 将char []从网络转换为主机订单,并分配给无符号int

C++ convert char[] from network to host order and assign to unsigned int

本文关键字:分配 int 无符号 主机 char 转换 网络      更新时间:2023-10-16

我有一个在网络字节顺序中的字符数组。我正在尝试将存储在索引[4-7]中的字符转换为主机顺序,并将其分配给未签名的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(由于我在Mac上而accutly LLDB),我可以看到该操作会生成正确的结果,但是在分配后,该值是错误的:

   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

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

您可能需要将unsigned char用于缓冲区类型。