从 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
.
我需要从传输流中提取一些信息,如 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
.