2014-12-24 4 views
-5

32 비트 정수로 된 이진 파일을 읽어야합니다. 하지만 ifstream.read() (C++) 및 fread() (C)를 사용하면 완전히 잘못된 대답을 얻게됩니다. 정수 값을 거꾸로 읽는 것 같습니다. 예를 들어 비트 문자열 \0\0\0\r (문자로 변환)을 읽으면 값 13을 가져올 때 값 218,103,808이 표시됩니다.이 값은 다음과 같습니다.C++ 및 C로 이진 파일에서 정수를 읽는 방법

0000 1101 0000 0000 0000 0000 0000 0000 (218,103,808)

0000 0000 0000 0000 0000 0000 0000 1101 (13)

및 2 진 변환 된 비트 열은 다음과 같아야

0000 0000 0000 0000 0000 0000 0000 1101 (\0\0\0\r)

처음 3 바이트는 널 문자이고 마지막 바이트는 ascii 값이 13이기 때문에

그래서 처음에는 잘못된 것이고 2 번째 이유는 218,103,808 대신에 13? 셋째, 13의 원하는 결과를 얻으려면 어떻게해야합니까? 여기

는 다른 유용한 정보입니다 : 코드의

선 내가 읽는 데 사용 i는 부호없는 int이며, 파일이 ifstream입니다 file.read((char*)&i, 4);이다; fread(&i, 4, 1, file); 여기서 i은 다시 부호없는 int이고 파일은 FILE*입니다.

마지막 바이트 인 \r을 읽으면 정확한 값을 얻을 수 있지만 데이터의 1 바이트에 맞지 않는 int는 읽을 수 있어야합니다.

C 나 C++에 대한 답을 얻을 수 있다면 좋겠지 만 C와 C++ 모두에 대한 답변을 기대하고 있습니다.

미리 감사드립니다.

+0

Endianess 문제와 유사합니다. 'ntohl()'/'htonl()'함수를보고 싶을 수도 있습니다. – alk

+0

컴퓨터의 엔디안을 노출 한 것처럼 보입니다 – Daniel

+0

'i'가 부호없는 int이면'char *'에 타입 캐스팅하는 이유는 무엇입니까? 이 주제와 관련하여 오른쪽에 링크 된 다른 질문 중 도움이되지 않았습니까? 특히 * C에서 파일로부터 리틀 엔디안 정수를 읽는 방법 *, * C에서 파일의 이진수 읽기 *, 파일에서 이진수 읽기 및 정수로 저장 *, * 파일에서 이진 읽기 *, * C *의 파일에서 이진 정수 읽기, * fread를 사용하여 이진 파일에서 정수를 읽으려면 어떻게해야합니까? *. –

답변

0

파일이 리틀 엔디안 바이트 순서로 기록되었습니다. 귀하의 기계는 빅 endian 바이트 순서를 사용합니다. 혹은 그 반대로도. 분명한 해결책은 읽기 및 쓰기 작업시 바이트 순서를 뒤집는 것입니다. 여기에 많은 질문들이 있습니다.

실제로 파일이 컴퓨터 바이트 순서를 사용하여 작성되어야하는지 여부를 고려해야합니다. 일반적인 접근법은 네트워크 바이트 순서 (항상 빅 엔디안)를 사용하여 파일을 작성한 다음 데이터를 읽을 때 호스트 바이트 순서 (시스템 바이트 순서)로 변환하는 것입니다.

아마도 파일은 네트워크 바이트 순서로 쓰여지고 프로그램은 호스트 바이트 순서로 변환하는 데 필요한 단계를 놓치 셨을 것입니다.

 
13 
218103808 

이이 문제의 두 가지 값은 다음과 같습니다

이 프로그램

#include <stdio.h> 
#include <stdint.h> 

uint32_t reversed(uint32_t val) 
{ 
    return ((val>>24)&0xff) | 
      ((val<<8)&0xff0000) | 
      ((val>>8)&0xff00) | 
      ((val<<24)&0xff000000); 
} 

int main(void) 
{ 
    uint32_t val = 13; 
    printf("%d\n", val); 
    printf("%d\n", reversed(val)); 
    return 0; 
} 

이 출력을 가지고있다. 나는 이것이 당신에게 단순한 엔디안 반전이 있음을 확신 시킨다는 것을 믿습니다.

관련 문제