여기 내 첫 번째 질문은 C++에서 이진 파일을 읽는 것에 대해 이야기하고 싶습니다. ID3 태그 라이브러리를 코딩하고 있습니다. 그를 처리하는 코드의 조각은 여기바이너리 ifstream을 읽는 동안 C++, 이상한 동작이 발생했습니다.
ID3 = 3 bytes = constant identifier
0xXXXX = 2 bytes = version (MSB: major version, LSB: minor. eg: 0x0301 = v3.1)
0xXX = 1 byte = some flags
4*0xXX = 4 bytes = size
것 :
char id[4];
uint16_t version;
uint8_t flags;
uint32_t size;
std::ifstream _stream;
_stream = std::ifstream(_filename, std::fstream::binary);
_stream.read(id, 3);
id[3] = 0;
// process id
_stream.read((char *)&version, 2);
// process version
_stream.read((char *)&flags, 1);
// process flags
_stream.read((char*)&size, 4);
// process flags
_stream.close();
모든 것이 잘 작동
나는 처음 10 바이트는 다음과 같습니다 바이너리 파일이있는 헤더를 구문 분석하고 있습니다 버전을 제외하고. 그것은 v3.0 (0x0300), 라고 말할 수 있습니다. 버전에서 설정된 값은 0x03입니다. 문자열의 끝으로 0x00을 고려할 것이므로 텍스트 모드에서이 동작을 이해할 것입니다.하지만 여기서는 바이너리로 읽고 있습니다. 그리고 숫자 형식을 사용하십시오.
다른 이상한 것은, 내가 2 번에 처리하면 내가 예를 들어, 작동 할 수 있습니다 : 버전의 값이 0x0300이 경우에
uint16_t version = 0;
char buff;
_stream.read(&buff, 1);
version = (buff << 8);
_stream.read(&buff, 1);
version |= buff;
합니다.
첫 번째 방법이 제대로 작동하지 않는 이유는 무엇입니까? 내가 잘못하고 있니?
어쨌든 도와 주셔서 감사합니다.
건배!
를 사용하여 바이트를 교환 "리틀 엔디안"와 "큰 엔디안 ". –
먼저 파일 형식 (EBNF 표기법)을 정확하게 정의해야합니다. –
제쳐두고, 플랫폼 독립적 인 코드를 찾는다면 바이트가 8 비트라는 보장은 없습니다 case는 아마도 고정 너비 정수 타입도 지원하지 않을 것입니다. – AndyG