如何在java中将位写入字节数组?

时间:2016-11-27 22:00:11

标签: java bit-manipulation byte

我尝试创建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等......

1 个答案:

答案 0 :(得分:0)

这是简单的位操作:

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