2016-11-30 8 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 내가 맥에있어 때문에) :

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에서 나는 당신이 인덱스의 값을 표시 할 수 있습니다

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

추측 (그것은 unsigned int입니다) char 유형이 서명되어 음수 값을 포함 할 수 있습니다. 그것들은 unsigned int으로 잘 변환되지 않습니다.

버퍼 유형으로 unsigned char을 사용할 수 있습니다.