2013-08-15 2 views
0

16 진수 값으로 구성된 이진 문자열을 작성하려고합니다 ... sprintf가이를 수행하는 올바른 방법이 아니라는 것을 배웠습니다. 장치를 보내야하는 구성 설정을 수집하는 간단한 GUI가 있습니다. 값은 서명 될 수 있으며 항상 숫자입니다. 내가 좋아하는 값의 집합이 있습니다C - char 및 int를 사용하여 패킷 만들기

#define PKTHEAD 0xA5 
#define VALONE 0xA0 
#define VALTWO 0xA1 
#define VALTHREE 0xA2 
#define PKTTAIL 0x5A 

signed int val1 = 10000; //0x2710 
signed int val2 = -84; //0xFFAC 
signed int val3 = -175001 //0xFFFD5467 

내 최종 목표는 PKTHEAD "닮은 것 패킷을 가지고하는 것입니다 | PKTHEAD | PKTHEAD | VALONE | VAL1 | VALTWO |을 val2 | VALTHREE | val3 | PKTTAIL | PKTTAIL | PKTTAIL "이며 16 진수 표현은 A5A5A5A000002710A1FFFFFFACA2FFFD54675A5A5A입니다.

는 지금은이 일을 해요 :

int main(int argc, char *argv[]) 
{ 
    int numBytes = 10; 
    signed char *tmp; 
    signed char *pyld; 
    pyld = calloc(numBytes, sizeof(char)); 

    signed int val1 = 10000; //0x2710 
    signed int val2 = -84; //0xFFAC 
    signed int val3 = -175001 //0xFFFD5467 

    tmp = pyld; 

    *(tmp + (numBytes - 1)) = DACHEAD; 
    *(tmp + (numBytes - 2)) = DACHEAD; 
    *(tmp + (numBytes - 3)) = DACHEAD; 
    *(tmp + (numBytes - 4)) = VALONE; 
    *(tmp + (numBytes - 5)) = val1; 
    printf("payload = %hhx%hhx%hhx%hhx%hx%hx%hhx%hx\n", pyld[9], pyld[8], pyld[7], pyld[6], pyld[5], pyld[4], pyld[3], pyld[2], pyld[1], pyld[0]); 
} 

출력은 "페이로드 = a5a5a5a0100a1ffac"

내 val1과 값이 잘못하고 구성하는 더 나은 방법이 있는지 궁금 해요 이 패킷. 대신 비트 교대를해야합니까?

도움을 주시면 대단히 감사하겠습니다.

감사합니다.

답변

0

네트워크를 통해 데이터를 보내는 더 좋은 방법은 직렬화 라이브러리를 사용하는 것입니다. 예를 들어, 당신이 먼저 당신이 필요로하는 integer 크기를 이해해야 외부 라이브러리를 사용하지 않는 경우, 또한 this question

를 참조 중 하나는 16 bit 또는 32 bitendianness (그리고 그에 따라 변환) 장치가 사용하고 항상 올바른 크기의 값을 2 진 버퍼에 넣으려면 memcpy을 사용하는 것이 좋습니다.