2016-11-30 35 views
0

我有一個網絡字節順序的字符數組。我試圖將存儲在索引[4-7]中的字符轉換爲主機順序,並將其分配給unsigned int。我有以下功能:C++從網絡到主機順序轉換char []並分配給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

競猜你的char類型是有符號的,所以它可以包含負值。那些轉換不好到unsigned int

您可能希望使用unsigned char作爲緩衝區類型。