【问题标题】:Extract information from a Transport Stream in Java从 Java 中的传输流中提取信息
【发布时间】:2023-03-06 00:35:01
【问题描述】:

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

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

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

但我无法理解获取buf[1] 并将8 移到左侧的原因,因为要获取PID 信息,我需要从buf[1] 获取最后5 位,从buf[2] 获取全部8 位。我测试了代码,结果很好。我只想了解第一部分的意思:buf[1] &lt;&lt; 8 在等式中。有人可以帮我吗?

【问题讨论】:

    标签: java mpeg2-ts transport-stream


    【解决方案1】:

    PID 是 13 位长。

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

    保存 PID 的最小 Java 整数类型是 short(16 位有符号整数)。 buf[1] &lt;&lt; 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] &amp; 0xff 是必需的,因为在 Java 中所有字节都是有符号的,而您需要该字节的无符号 int 值。最后,整个事情都被0x1fff 掩盖,以保留相关的 13 位。如果你想要一个short,你必须转换结果int

    【讨论】:

    • 谢谢@aergistal!现在我明白了。
    • 你知道有什么网站可以让我获得更多关于位掩码的信息吗?就像,我有更多信息可以提取每个具有不同大小的位,但我没有每个位的掩码
    • 您可以在 Wikipedia 上查看所有按位运算的示例:en.wikipedia.org/wiki/Bitwise_operation|OR&amp; 是 AND 等等。
    【解决方案2】:

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

    不要做数学int a = 0x12 | 0x32 什么是集合? a = 0x36

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

    我们如何将0x12 变成0x1200?我们将其左移 8 位。 (buf[1] &lt;&lt; 8)

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 2012-09-10
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多