【问题标题】:How can I write bits to byte array in java?如何在java中将位写入字节数组?
【发布时间】:2016-11-27 22:00:10
【问题描述】:

我尝试创建 mpegts 演示时间戳。它是 5 个字节的长度。我在 VLC 播放器的源代码中找到了解决方案。它看起来像这样(在 C 语言代码中):

bits_write( &bits, 4, i_pts_dts ); // '0010' or '0011'
bits_write( &bits, 3, i_pts >> 30 );
bits_write( &bits, 1, 0x01 ); // marker
bits_write( &bits, 15, i_pts >> 15 );
bits_write( &bits, 1, 0x01 ); // marker
bits_write( &bits, 15, i_pts );
bits_write( &bits, 1, 0x01 ); // marker
i_header_size -= 0x5;

这意味着我必须从 40 位中收集 5 个字节。 例如,我需要从 2350 十进制数中提取 5 个字节。二进制视图:

1001 0010 1110

在 VLC 操作之后,我必须有这个二进制视图:

0010 000 1 000000000000000 1 000100100101110 1

十六进制视图:

21 00 01 12 5D

如何在 Java 中做到这一点?

我还在 GitHub 上找到了 Java 解决方案:https://github.com/taktod/myLib/blob/master/myLib.MIT/myLib.container.mpegts/src/main/java/com/ttProject/container/mpegts/field/PtsField.java 但这种认识太难了。对于一次性操作,需要创建太多的辅助类,如 Bit1、Bit2、Bit3 等...

【问题讨论】:

  • 您确定输入位如何映射到输出字节,例如将其写在纸上,然后使用Java bit-manipulation operators 构建该结果。
  • @Andreas,我知道位操作运算符。例如,我可以处理 String 中的 40 位,然后转换为 long,但 long 的大小为 4 字节。 Double 有 8 个字节。但我需要 5 个字节。我不知道我该怎么做。

标签: java bit-manipulation byte


【解决方案1】:

这是简单的位操作:

int dts = 2;     // must be 2 or 3
long pts = 2350; // must be less than 8,589,934,592

byte[] output = new byte[] {
        (byte) (dts << 4 | pts >> 30 | 1),
        (byte) (pts >> 22),
        (byte) (pts >> 15 | 1),
        (byte) (pts >> 7),
        (byte) (pts << 1 | 1)
};
for (byte b : output)
    System.out.printf("%02x ", b); // prints: 21 00 01 12 5d 

【讨论】:

  • 哦,太好了,谢谢。
猜你喜欢
  • 2015-07-05
  • 2015-09-04
  • 2010-12-18
  • 2012-05-14
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多