2012-10-17 6 views
5

나는 아래의 c 프로그램을 가지고 있는데, 나는 특별한 명령 Eg.0x00000001로 32 비트 메시지를 보내고 싶다. 출력이 왜 이렇게 생깁니 까?

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 
#include <stdint.h> 

struct test 
{ 
    uint16_t a; 
    uint16_t b; 
}; 

int main(int argc, char const *argv[]) 
{ 
    char buf[4]; 
    struct test* ptr=(struct test*)buf; 
    ptr->a=0x0000; 
    ptr->b=0x0001; 
    printf("%x %x\n",buf[0],buf[1]); //output is 0 0 
    printf("%x %x\n",buf[2],buf[3]); //output is 1 0 
    return 0; 
} 

는 그럼 문자 배열의 값을 출력하여 인쇄 테스트. 나는 위의 코멘트에서 결과를 얻었다. 출력은 0 0과 0 1이 아니어야합니까? 이후 [3]은 마지막 바이트입니까? 내가 놓친 것이 있습니까?

감사합니다.

답변

7

리틀 엔디안을 발생시킵니다. 이 읽기 : Endianness

을 네트워크 순서로 변환의 경우, htonl (호스트 - 네트워크 길이) 및 htons (호스트 - 네트워크 - 짧은) 번역 기능을 사용해야합니다. 받은 후 네트워크에서 호스트 순서로 변환하려면 ntohlntohs 함수를 사용해야합니다. 바이트가 배열에 배치되는 순서는 메모리에 어떻게 배치했는지에 따라 다릅니다. 이들을 4 개의 별도의 짧은 바이트로두면 엔디 언 변환이 생략됩니다. 이런 종류의 가공하지 않은 바이트 조작에는 char 유형을 사용할 수 있습니다. 윈도우로 데이터를 유지 Little Endians

+0

그래서 socket.h에서 sendto()를 사용하여 보낼 때 어떻게 보이나요? 0x00000001 또는 0x00000100이 될 것입니까? – kun

+0

@cjk : 보내기 위해'htons'를 사용할 필요가 있습니다. 이것은 당신을위한 정확한 엔디안을 아끼지 않습니다. – Vlad

1

시스템 저장 번호는 "리틀 엔디안은"그래서 바이트 반전된다. 자세한 내용은 Endiannes을 참조하십시오.

0

관련 문제