2014-12-10 2 views
0

그래서 적어도 16 바이트 길이 여야하는 바이트로 채워진 버퍼가 있습니다. 바이트 0 - 11에 대해서는 신경 쓰지 않습니다. 12에서 15까지의 4 바이트는 32 비트 숫자를 나타냅니다.배열에서 문자를 UINT32로 추출합니다.

어떻게하면이 바이트를 추출하여 32 비트 숫자로 나타낼 수 있습니까?

답변

1

당신은 8 비트 부호없는 숫자로 각 바이트를 변환 할 수 있습니다, 당신은 하나의 32 비트 수를 사용하여 비트 연산에이 숫자를 조합 할 수 있습니다 :

uint32_t result = 0; 

for (int i = 12; i < 16; i++) { 
    result <<= 8; 
    result |= (uint8_t)bytes[i]; 
} 
+0

나는이 값이 191이어야한다는 것을 알고있다. 그러나이 방법은 나에게 808469062 – dubbeat

+0

@dubbeat 아마도 엔디안 문제를 준다? (즉, 바이트 쿼텟의 다른 쪽에서 시작해야합니다.) (btw, 191은 하나의'unsigned char '에 완벽하게 들어 맞습니다. 실제로이 4 바이트가 필요합니까?) 그리고 버퍼의 실제 내용을 검사 했습니까? 디버거를 사용하거나 바이트 단위로 인쇄 하시겠습니까?) –

0

나는 'unions{}와 고정, 내가 할 수있는 도와 줘.

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <string.h> 
#include <arpa/inet.h> 

uint32_t 
convert_int(char bytes[4]) 
{ 
     union {uint32_t n; char bytes[4];} box; 

     memcpy(&box.bytes[0], bytes, sizeof(*bytes)); 
     return ntohl(box.n); 
} 

int 
main(void) 
{ 

     uint32_t number; 

     number = convert_int("\x0A\x00\x00\x00"); 
     printf("%d\n", number); 
     return 0; 
} 

convert_int()는 네트워크 바이트 순서 (빅 엔디안) (최상위 바이트 먼저)에서 4 바이트를 받아 32 비트 정수로 변환;이 도움이 될 수 있습니다 호스트 바이트 순서 (빅 또는 리틀 엔디안 중 하나) 버퍼를 제어 할 수 있으므로 필요에 따라 인수를 배치 할 수 있습니다.

관련 문제