Я пишу синтаксический анализатор файлов MPEG-TS, и я застрял на получении program_numbers и PID из раздела PAT. Я использую анализатор пакетов, чтобы сравнить свои результаты.
Например, вот пакет PAT
47 40 00 16 00 00 B0 31 00 14 D7 00 00 00 00 E0
10 00 01 E0 24 00 02 E0 25 00 03 E0 30 00 04 E0
31 00 1A E0 67 00 1C E0 6F 43 9D E3 F1 43 A3 E3
F7 43 AC E4 00 C3 69 A6 D8 FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF
Сначала я начал сравнивать результаты анализатора с байтами, чтобы увидеть связь. Это спарило байты следующим образом: [00 10] [01 24] [02 25] [03 30] и т. Д. Я заметил образец (для i = 14; i < конец; я + = 4) но это быстро обернулось ошибкой, потому что после байта «0x6F» он начал читать 16 бит, а не 8, поэтому номер_программы был 0x439D.
Я серьезно запутался и надеюсь, что кто-нибудь сможет объяснить мне, как разобрать пример PAT сверху.
каждый program_number
16 бит и сопровождается 16 битами, состоящими из 3 х ‘1’ бит и 13 бит program_map_pid
(или же network_pid if
program_number` = 0)
Начните со смещения 13 в вашем дампе и прочитайте пары 16-битных слов, маскируя верхние 3 бита второго слова.
например
offset bytes words program_number pid
====== =========== ========= ============== ======================
000D: 00 00 E0 10 => 0000 E010 => 0000 0010 (network_pid)
0011: 00 01 E0 24 => 0001 E024 => 0001 0024 (program_map_pid)
0015: 00 02 E0 25 => 0002 E025 => 0002 0025 (program_map_pid)
0019: etc..
001D: etc..
0021: etc..
0025: 00 1C E0 6F => 001C E06F => 001C 006F (program_map_pid)
0029: 43 9D E3 F1 => 439D E3F1 => 439D 03F1 (program_map_pid)
002D: etc..
etc..
Теоретически это сложнее, чем это, поскольку в PAT может быть несколько разделов ассоциации программ, и вышеизложенное поможет только в первом разделе.
Для получения более подробной информации см. Раздел 2.4.4.3 ISO / IEC 13818-1, в частности таблицу 2-25.