2012-08-27 2 views
1

파일에서 64 비트 부호없는 정수를 읽으려면 어떻게해야합니까? 문자열 표현이 아닌 실제 이진 데이터로 저장되어 있습니다.fscanf()를 사용하여 unsigned long long을 읽으십시오.

+4

, 당신은 다음 FREAD 사용하십시오 fscanf가 아닙니다. 문자열에서 읽는 것이기 때문입니다. http://www.cplusplus.com/reference/clibrary/cstdio/fread/ – billjamesdev

답변

3

어떻게 인코딩 되나요? 이진수는 일반적으로 endianness입니다. 현재 호스트의 엔디안과 같다고 가정하려면 fread을 직접 사용할 수 있습니다. 그렇지 않으면, 읽은 후에 바이트 스왑해야합니다.

보너스 포인트의 경우 직렬화 방식을 제어한다고 가정하면 일부 플래그 또는 바이트 순서 표시로 엔디안을 나타낼 수 있습니다. 이 같은

3

뭔가 :이 데이터를 쓴 당신이라면

FILE * fp = fopen("file.bin", "rb"); 

uint64_t value; 
if (fread(&value, sizeof value, fp) != sizeof value) { /* error */ } 

// ... 

fclose(fp); 

는,이 상자 밖으로 작동합니다. 데이터가 다른 곳에서 온 것이라면 직렬화 된 형식과 플랫폼 간의 표현 차이 (예 : 바이트 교환이 필요할 수 있음)를 설명하기 위해 이진 형식의 문서를 확인하십시오.


교육적으로는 더 유용하지만 덜 효율적인 방법은 데이터를 버퍼로 읽어 들이고 자신의 처리를 적용하는 것입니다. 이것은 (예를 들어, 당신이 3-2-1-4-7-8-6-5처럼 미친 endian을 해결할 수있는) 더 유연하지만 느린 아마 많은 : 잘

unsigned char buf[sizeof uint64_t]; 
if (fread(buf, sizeof buf, fp) != sizeof buf) { /* error */ } 
uint64_t leval = buf[0] + (buf[1] << 8) + /* ... */; 
uint64_t beval = buf[7] + (buf[6] << 8) + /* ... */; 
uint64_t ceval = (buf[0] << 16) + (buf[1] << 8) + buf[2] + (buf[3] << 24) + /* ... */; 
관련 문제