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++ 모두에 대한 답변을 기대하고 있습니다.
미리 감사드립니다.
Endianess 문제와 유사합니다. 'ntohl()'/'htonl()'함수를보고 싶을 수도 있습니다. – alk
컴퓨터의 엔디안을 노출 한 것처럼 보입니다 – Daniel
'i'가 부호없는 int이면'char *'에 타입 캐스팅하는 이유는 무엇입니까? 이 주제와 관련하여 오른쪽에 링크 된 다른 질문 중 도움이되지 않았습니까? 특히 * C에서 파일로부터 리틀 엔디안 정수를 읽는 방법 *, * C에서 파일의 이진수 읽기 *, 파일에서 이진수 읽기 및 정수로 저장 *, * 파일에서 이진 읽기 *, * C *의 파일에서 이진 정수 읽기, * fread를 사용하여 이진 파일에서 정수를 읽으려면 어떻게해야합니까? *. –