我有一个以网络字节顺序排列的字符数组。我正在尝试将存储在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
答案 0 :(得分:0)
猜猜您的char
类型已签名,因此它可以包含负值。那些不能很好地转换为unsigned int
。
您可能希望将unsigned char
用于缓冲区类型。