2015-09-19 12 views
0

Мне нужно извлечь некоторую информацию из транспортного потока, как PID, ПАТ, PMT и т.д.Извлечение информации из транспортного потока в Java

Я нашел пример кода, чтобы получить PID:

pid = ((buf[1] << 8) | (buf[2] & 0xff)) & 0x1fff; 

Но я не мог понять причину получения buf[1] и сдвига 8 на левую сторону, потому что для получения информации PID мне нужно получить 5 последних бит от buf[1] и всех 8 от buf[2]. Я тестировал код, и результат был хорошим. Я просто хочу понять среднее значение этой первой части: buf[1] << 8 в уравнении. Может кто-нибудь мне помочь?

ответ

0

ПИД-код 13 бит.

Буфер buf представляет собой массив byte. Каждый элемент имеет 8 бит.

Наименьший целочисленный тип Java для хранения PID - это short (16-разрядное целое число со знаком). buf[1] << 8 продвигает byte до int (4 байта) при сдвиге, поэтому у вас теперь достаточно места для хранения результата.

buf[1] = XXXXXXXX 
    buf[2] = YYYYYYYY 

    buf[1] << 8 
    shifted 8 positions to the left in a 32-bit int 

    0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X X X X X X X X 0 0 0 0 0 0 0 0| 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 


    (buf[1] << 8) | buf[2] 

    0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X X X X X X X X Y Y Y Y Y Y Y Y| 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 


    ((buf[1] << 8) | buf[2]) & 0x1fff 

    0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
    |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X X X X X Y Y Y Y Y Y Y Y| 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

buf[2] & 0xff необходима, поскольку в Java все байты подписаны и вам нужно неподписанный int значение байта. Наконец, все это замаскировано 0x1fff, чтобы сохранить соответствующие 13 бит. Если вы хотите short, вы должны нанести полученный результат int.

+0

Спасибо @aergistal! Теперь у меня есть идеа. – kileros

+0

Вы знаете какой-либо веб-сайт, который я могу получить больше информации о битмасках? Например, у меня есть дополнительная информация для извлечения каждого из них с разным размером бит, но у меня нет масок для каждого из них. – kileros

+0

. Вы можете увидеть примеры для всех побитовых операций в Википедии: https://en.wikipedia.org/wiki/ Bitwise_operation. '' '' 'OR',' & 'is AND и так далее. – aergistal

0

Допустим, что ваш ПИД-код равен 4660 или 0x1234. так buf[1] = 0x12, и buf[2] = 0x34

Lest do the math int a = 0x12 | 0x32 Что такое набор? a = 0x36.

0x36 != 0x1234. Нам нужно int a = 0x1200 | 0x34, чтобы получить 0x1234

Как мы превращаем 0x12 в 0x1200? Мы сдвигаем его на 8 бит. (buf[1] << 8)

 Смежные вопросы

  • Нет связанных вопросов^_^