2016-11-30 1 views
0

ネットワークバイトオーダーの文字配列を持っています。私は、インデックス[4-7]に格納されている文字をホスト順に変換し、それを符号なしintに代入しようとしています。私は、次の機能を持っている:C++がネットワークからホストの順番にchar []を変換し、符号なしintに代入する

GDBから
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; 
} 

操作が正しい結果を生成することを私が見ることができますが、代入した後、値が間違っている(acutally 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を使用します。

関連する問題