그래서 적어도 16 바이트 길이 여야하는 바이트로 채워진 버퍼가 있습니다. 바이트 0 - 11에 대해서는 신경 쓰지 않습니다. 12에서 15까지의 4 바이트는 32 비트 숫자를 나타냅니다.배열에서 문자를 UINT32로 추출합니다.
어떻게하면이 바이트를 추출하여 32 비트 숫자로 나타낼 수 있습니까?
그래서 적어도 16 바이트 길이 여야하는 바이트로 채워진 버퍼가 있습니다. 바이트 0 - 11에 대해서는 신경 쓰지 않습니다. 12에서 15까지의 4 바이트는 32 비트 숫자를 나타냅니다.배열에서 문자를 UINT32로 추출합니다.
어떻게하면이 바이트를 추출하여 32 비트 숫자로 나타낼 수 있습니까?
당신은 8 비트 부호없는 숫자로 각 바이트를 변환 할 수 있습니다, 당신은 하나의 32 비트 수를 사용하여 비트 연산에이 숫자를 조합 할 수 있습니다 :
uint32_t result = 0;
for (int i = 12; i < 16; i++) {
result <<= 8;
result |= (uint8_t)bytes[i];
}
나는 '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 비트 정수로 변환;이 도움이 될 수 있습니다 호스트 바이트 순서 (빅 또는 리틀 엔디안 중 하나) 버퍼를 제어 할 수 있으므로 필요에 따라 인수를 배치 할 수 있습니다.
나는이 값이 191이어야한다는 것을 알고있다. 그러나이 방법은 나에게 808469062 – dubbeat
@dubbeat 아마도 엔디안 문제를 준다? (즉, 바이트 쿼텟의 다른 쪽에서 시작해야합니다.) (btw, 191은 하나의'unsigned char '에 완벽하게 들어 맞습니다. 실제로이 4 바이트가 필요합니까?) 그리고 버퍼의 실제 내용을 검사 했습니까? 디버거를 사용하거나 바이트 단위로 인쇄 하시겠습니까?) –