2008-10-02 6 views
2

C 프로그램 long (long)을 가지고 있으므로 직렬화 (chars로 변환)하고 싶습니다. long은 단일 char에 맞지 않으며 크기는 프로세서에 따라 다릅니다 (4 바이트 또는 8 바이트가 될 수 있음).long 배열의 직렬화 (C 언어)

Theres는 직렬화 및 역 직렬화를 수행하는 좋은 방법입니까?

답변

1
long * longs; 

// ... 

int numChars = numLongs * sizeof(long); 
char* longsAsChars = (char*) longs; 
char* chars = malloc(numChars); 
memcpy(chars, longsAsChars, numChars); 
+0

다른 아키텍처에서 작동하지 않습니다. –

+0

왜 안 되니? 항상 사양에 따라 작동해야한다고 생각합니다. – Lev

+0

C에서 'new'가 언제 허용 되었습니까? –

0

긴 배열의 시작을 가리키는 char 포인터를 만드는 경우 char "배열"을 통해 증가 할 때 한 번에 8 비트가 생성됩니다. 길이가 널 (null)로 끝나지는 않을 것이므로 (반드시,있을 수도 있음)주의해야합니다. 따라서 끝이 어디인지를 추적해야합니다. 당신이

sizeof(long) 

로하지만 당신이 오랫동안 저장하면 serialize해야 여러 플랫폼간에 양도 할 경우 장기의 크기를 얻을 수 있습니다 C에서

long list[MAX]; 
char *serial = list; 
int chunk = sizeof(long); 
int k; 
for(k=0; k<(MAX*chunk); k++){ 
    // do something with the "char" 
} 
1

: 예를 들어

항상 4 바이트입니다. 어쨌든 큰 숫자는 4byte 프로세서에서 읽을 수 없습니다.

2

잘못된 문제를 해결할 가능성이 높습니다. 예를 들어 int32_t를 사용하여 고정 된 크기의 int로 직렬화해야합니다. 프로그램 전체에이 고정 크기 유형을 사용하려고하거나 64 비트 프로그램이 더 작은 크기로 저장할 수 없거나 int64_t를 사용할 수없는 경우 문제가 발생합니다.

32 비트 플랫폼에서 64 비트 저장을로드 할 필요가 없다는 것을 안다면 신경 쓰지 마십시오. sizeof (long) 바이트를 파일에 쓰고 sizeof (long) 바이트를 다시 읽으십시오. 그러나 실수를 피하기 위해 원본 플랫폼을 나타내는 플래그를 데이터에 일찍 붙이십시오.

2

char로 직렬화 할 필요가 없습니다. 파일로 길게 쓸 수 있습니다. char 배열에 직렬화하려면 int의 크기와 바이트 순서를 나타 내기 위해 처음에 바이트를 투자하십시오. 나중에 필요합니다.

char *p = &long_array[0]; 

CHAR 단순히 캐스트로 길게 배열 액세스하려면 - 문자의 크기를 얻을 수 (길이)를 sizeof하여 어레이의 복수 길이.

간단한 예이 보여

#include <stdio.h> 

main() 
{ 
    int aaa[10]; 
    int i; 
    char *p; 

    for(i=0;i<sizeof(aaa)/sizeof(aaa[0]);i++) 
    { 
     aaa[i] = i; 
     printf ("setting aaa[%d] = %8x\n",i,aaa[i]); 
    } 

    aaa[9] = 0xaabbccdd; 

    printf ("sizeof aaa (bytes) :%d\n",sizeof(aaa)); 
    printf ("each element of aaa bytes :%d\n",sizeof(aaa[0])); 

    p = (char*) aaa; 
    for(i=0;i<sizeof(aaa);i++) 
     printf ("%d: %8x\n",i,(unsigned char)p[i]); 
} 
2

이 printf와 사용 등 아무 근처 비효율적 휴대용이지만/scanf와

void longtochar(char *buffer, unsigned long number) { 
    int i; 
    for (i=0; i<sizeof(long); i++) { 
     buffer[i] = number & 0xFF; // place bottom 8 bits in char 
     number = number >> 8; // shift down remaining bits 
    } 
    return; // the long is now stored in the first few (2,4,or 8) bytes of buffer 
} 

다시 풀고 (긴 가정하면 동일한 크기이다)

long chartolong(char *buffer) { 
    long number = 0; 
    int i; 
    for (i=sizeof(long)-1; i>=0; i--) { 
     number = number << 8; // left shift bits in long already 
     number += buffer[i]; // add in bottom 8 bits 
    } 
    return number; 
} 

긴 두 시스템에서 동일한 길이라는 큰 가정을주의 마십시오. 안전한 방법은 # <stdint.h>을 포함하고 제공하는 유형 (uint32 _t 또는 uint16 _t)을 사용하는 것입니다.

또한 내 코드에는 부호없는 long이 있습니다. 현재 C 컴파일러에 액세스 할 수 없으므로 서명 된 정수로 작동하지 않을지 여부를 확인할 수 없습니다. 기억이 나를 섬기면, 그 행동은 정의되지 않을 수도 있습니다.