从 Java 中的传输流中提取信息

Extract information from a Transport Stream in Java

我需要从传输流中提取一些信息,如 PID、PAT、PMT 等

我找到了获取 PID 的示例代码:

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

但我无法理解获取 buf[1] 并将 8 移到左侧的原因,因为要获取 PID 信息,我需要从 buf[1] 获取最后 5 位和所有 8来自 buf[2]。我测试了代码,结果很好。我只想了解方程式中第一部分的均值:buf[1] << 8。有人可以帮助我吗?

假设您的 PID 是 4660 或 0x1234。所以 buf[1] = 0x12,并且 buf[2] = 0x34

Lest do the math int a = 0x12 | 0x32 set 是什么? a = 0x36

0x36 != 0x1234。我们需要的是int a = 0x1200 | 0x34得到0x1234

我们如何将 0x12 变成 0x1200?我们将它左移 8 位。 (buf[1] << 8)

PID 为 13 位长。

缓冲区 buf 是一个 byte 数组。每个元素都是8位。

保存 PID 的最小 Java 整数类型是 short(16 位有符号整数)。 buf[1] << 8 在移动时将 byte 提升为 int(4 个字节),因此您现在有足够的 space 来保存结果。

  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.