2017-09-03 12 views
0

matroska 파일을 구문 분석해야하는 요구 사항이 있습니다. 파일의 처음 몇 바이트는 아래와 같이 주어진다.MKV 탐색 헤드 구문 분석

0x1a 0x45 0xDF를 동일한 0xA3하는 0x01 × 00 × 00 × 00 × 00 × 00 × 00 인 0x23 0x42를에는 0x86를 0x81 0x01로
0x42를 나타내는 0xF7를 0x81 0x01로하는 0x42은 0xF2를 0x81은 0x04 0x42를 0xf3를 0x81을 0x08으로 0x42가 0x82 0x88의 0x6d
이 0x61 따라 0x74 0x72 0x6f에는 0x73 0x6b이 0x61 0x42를에는 0x87를 0x81 를 0x04으로 0x42 0x85 0x81 등는 0x02 0x18
에는 0x53을 0x80 0x67 0x01로 × 00 × 00 × 00 × 00 0x33을 0xdb은 0x10 하게 0x11에는 0x4d 0x9b 따라 0x74는 0x40
하는 0x42하여 0xbf 0x84 0x11을 0xac 0x83 0x8a에는 0x4d 0xbb 경계 코드 0x8B에는 0x53 확인 0xAB 0x84 0x15 0x49까지는 0xa9
0x66에는 0x53 0xac를 0x81 0xe5 0x4d 0xbb 0x8c 0x53 0xab 0x84 0x16 0x54 0xae 0x6b 0x53
,0xac가 0x82하는 0x01 0x56에는 0x4d 0xbb 경계 0x8c에는 0x53 확인 0xAB 0x84 0x12를 0x54 0xc3 0x67에는 0x53 0xac
가 0x82 0x11을 0x5c가에는 0x4d 0xbb 경계 0x8d에는 0x53 확인 0xAB 0x84가 0x1c에는 0x53 0xbb 경계 0x6b에는 0x53 0xac 0x83
0x33을 0xd9가 0x1c 0xec하는 0x01 × 00 × 00 × 00 × 00 × 00 × 00 0x94 0x00으로 × 00 × 00 × 00
× 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00
× 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00 × 00

나는이 구문 분석을 시도하고있다 파일. 처음 59 바이트를 성공적으로 파싱했습니다. 이제 나는 60 번째 바이트에있다. 6 번째 바이트부터는 0x11 0x4d 0x9b 0x74 (굵게 표시)이므로 seekhead가 시작되고 있음을 의미합니다.

구문 분석 된 데이터를 보려면 mkvinfo를 사용했습니다. 아래에 나와있는 mkvinfo에 따라, 시크 헤드는 59에서 시작합니다.

seekhead parse

이 (가) 첫 번째 항목이 59에서이 무엇인지 71 위치로 이제 71에서 시작 추구 본다. 이 부분은 이해할 수 없습니다.

누군가이 부분을 이해할 수 있도록 도와주세요.

답변

3

당신이 (refer to the Matroska specification for details) 같은 바이트 구문 분석해야

다음과
0x11 0x4d 0x9b 0x74 (element ID: SeekHead) 
0x40 0x42 (element size: 66) 
0xbf (element ID: CRC-32) 
0x84 (element size: 4) 
0x11 0xac 0x83 0x8a (4-byte CRC-32 value) 
0x4d 0xbb (element ID: Seek) 
0x8b (element size: 11) 
0x53 0xab (element ID: SeekID) 
0x84 (element size: 4) 
0x15 0x49 0xa9 0x66 (SeekID value; refers to Info element ID) 
0x53 0xac (element ID: SeekPosition) 
0x81 (element size: 1) 
0xe5 (SeekPosition value: 229) 
0x4d 0xbb (element ID: Seek) 
0x8c (element size: 12) 
0x53 0xab (element ID: SeekID) 
0x84 (element size: 4) 
0x16 0x54 0xae 0x6b (SeekID value; refers to Tracks element ID) 
0x53 0xac (element ID: SeekPosition) 
0x82 (element size: 2) 
0x01 0x56 (SeekPosition value: 342) 
0x4d 0xbb (element ID: Seek) 
0x8c (element size: 12) 
0x53 0xab (element ID: SeekID) 
0x84 (element size: 4) 
0x12 0x54 0xc3 0x67 (SeekID value; refers to Tags element ID) 
0x53 0xac (element ID: SeekPosition) 
0x82 (element size: 2) 
0x11 0x5c (SeekPosition value: 4444) 
0x4d 0xbb (element ID: Seek) 
0x8d (element size: 13) 
0x53 0xab (element ID: SeekID) 
0x84 (element size: 4) 
0x1c 0x53 0xbb 0x6b (SeekID value; refers to Cues element ID) 
0x53 0xac (element ID: SeekPosition) 
0x83 (element size: 3) 
0x33 0xd9 0x1c (SeekPosition value: 3397916) 
0xec (element ID: Void) 
[I stopped parsing here] 

이러한 특정 바이트의 구조의 단순화 된 ASCII 그래픽입니다 같이

+- SeekHead -------+ 
| CRC-32   | 
| +- Seek--------+ | 
| | SeekID  | | 
| | SeekPosition | | 
| +--------------+ | 
| +- Seek--------+ | 
| | SeekID  | | 
| | SeekPosition | | 
| +--------------+ | 
| +- Seek--------+ | 
| | SeekID  | | 
| | SeekPosition | | 
| +--------------+ | 
| +- Seek--------+ | 
| | SeekID  | | 
| | SeekPosition | | 
| +--------------+ | 
+------------------+ 
Void 

내가했습니다를 마스터 요소 (다른 요소를 포함하는 요소)를 상자로 그린다.

은 첫 번째 항목이 59에서이 무엇인지 71 위치로 이제 71에서 시작 추구 보이는 :

는 특정 질문에 대답합니다. 이 부분은 이해할 수 없습니다.

SeekHead는 그것의 크기가 4 바이트 이상이 후 바이트 63에서, CRC-32 소자는 바이트 71에서, 그 이후의 바이트 65에서 시작하는 시작 바이트 59에서 시작하며, 제 Seek 요소가 발견된다.

나는 이것을 정신적으로 손으로 분석했습니다. 잘하면 나는 실수 나 오타를 만들지 않았다.