2014-11-18 2 views
1

xz 파일 형식 (http://tukaani.org/xz/xz-file-format.txt)에 대한 설명을 읽었습니다. 하지만 바이너리 편집기로 xz 파일을 조사하려고하면 설명에 정의 된 구조를 따르지 않는 것 같습니다. 내가 뭘 놓치고 있니?.xz 파일 형식 설명에 모두 설명되어 있습니까?

FD 37 7A 58 5A 00 00 04 E6 D6 B4 46 02 00 21 01 16 00 00 00 74 2F E5 A3 E0 A9 28 2A 99 5D 00 05 

전체 구성 :

난 XZ CLI를 리눅스에서 유틸리티 (XZ 버전 4.999.9beta) 및 이들의 처음 32 바이트 I 얻을로 (XZ-파일 FORMAT.TXT) 설명 파일을 압축 stream - stream 패딩 - stream - 등등. 그리고이 경우에는 파일에 압축 된 파일이 하나뿐이므로 스트림이 하나만 있어야한다고 생각합니다. 스트림의 구조는 다음과 같습니다. 스트림 헤더 - 블록 - 블록 - ... - 블록 - 인덱스 - 스트림 바닥 글. 그리고 스트림 헤더의 구조는 다음과 같습니다. header magic bytes - stream flags - crc code.

내 파일에서 스트림 헤더를 찾을 수 있지만 처음 16 바이트 이후에는 더 이상 설명을 따르지 않는 것 같습니다.

위의 처음 6 바이트는 분명히 마법 바이트입니다. 다음 두 바이트는 스트림 플래그입니다. 스트림 플래그는 CRC64가 사용되고 있음을 나타내므로 CRC 코드는 다음 8 바이트를 취합니다. 17 번째 바이트 (하나부터 계산)는 첫 번째 블록의 첫 번째 바이트 여야합니다.

블록의 구조는 다음과 같습니다. 블록 헤더 - 압축 된 데이터 - 블록 패딩 - 검사. 블록 헤더의 구조는 다음과 같아야합니다 : 블록 헤더 크기 - 블록 플래그 - 압축 된 크기 - 압축되지 않은 크기 - 필터 플래그 목록 - 헤더 패딩 - CRC. 따라서 17 번째 바이트는 블록 헤더 크기 (내 파일의 0x16)이어야합니다. 그건 가능하지만, 18 번째 바이트는 좀 이상해 보입니다. 블록 플래그 비트 필드 여야합니다. 내 파일에서 그것은 null입니다 - 플래그가 설정되어 있지 않습니다. 필터의 수는 설명에 따라 1-4 여야합니다.

블록 플래그의 비트 6과 7도 0이기 때문에 압축 된 크기와 압축되지 않은 크기가 파일에 나타나서는 안되며 다음 바이트는 필터 플래그 목록이어야합니다. 목록의 구조는 다음과 같습니다. 필터 ID - 특성의 크기 - 필터 특성. 19 번째 바이트는 필터 ID 여야합니다. 이것은 파일에서 공식적으로 정의 된 필터 ID가 아닌 null입니다. 그것이 커스텀 ID라면 9 바이트를 취할 것이지만 설명에 따르면 섹션 1.2에 기술 된 크기의 인코딩을 이해할 수 있으므로 설명에 따르면 "멀티 바이트 표현의 마지막 바이트를 제외하고는 모두 가장 높은 (8 번째) 비트가 설정되어 있습니다. "하지만 제 파일에서 20 번째 바이트도 null입니다.

내가 이해할 수 없거나 설명을 따르지 않는 파일이 있습니까?

답변

0

나는 조금씩 물어 보았고 해결책을 찾아 냈다. 누군가가 관심을 가지기를 바랍니다. 나는 내 자신의 질문에 답합니다.

스트림 헤더에서 스트림 플래그의 의미를 잘못 이해했습니다. 헤더의 CRC 코드 (항상 CRC32 임), 스트림 자체의 CRC (이름 스트림 플래그가 의미하는대로)에만 영향을줍니다. 이것은 헤더의 CRC가 단지 4 바이트 길이이므로 바이트 13-24가 유효한 블록 헤더를 형성 함을 의미합니다.

블록 헤더에서 블록 플래그 필드는 이전에 문제로 보았던 null 바이트입니다. 설명에 따르면 필터의 수는 1에서 4 사이 여야합니다. 따라서 적어도 하나 이상의 10 진수 값을 예상했습니다. 필터의 수가 2 비트로 표현되기 때문에 최대 십진수 값은 3이지만 가능한 값의 수 (제로 포함)는 물론 4이므로 0은 하나의 필터를 의미합니다.

블록 플래그의 마지막 두 비트도 0이므로 압축 된 크기 또는 압축되지 않은 크기 필드가 블록 헤더에 존재합니다. 즉, 바이트 15-17은 첫 번째 (및 유일한) 필터의 필터 플래그입니다. 필터 ID 0x21은 LZMA2 필터의 ID입니다. 속성의 크기 0x01은 1 바이트의 크기를 의미합니다. 사전 크기 0x16은 4096 KiB의 크기를 의미합니다.

관련 문제