首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中填充字节数组

在Java中填充字节数组
EN

Stack Overflow用户
提问于 2010-04-11 02:29:55
回答 5查看 16K关注 0票数 5

对于我正在工作的一个项目的一部分,我正在实现一个RTPpacket,其中我必须用RTP头字段填充字节的头数组。

代码语言:javascript
复制
  //size of the RTP header:
  static int HEADER_SIZE = 12; // bytes

  //Fields that compose the RTP header
  public int Version; // 2 bits
  public int Padding; // 1 bit
  public int Extension; // 1 bit
  public int CC; // 4 bits
  public int Marker; // 1 bit
  public int PayloadType; // 7 bits
  public int SequenceNumber; // 16 bits
  public int TimeStamp; // 32 bits
  public int Ssrc; // 32 bits

  //Bitstream of the RTP header
  public byte[] header = new byte[ HEADER_SIZE ];

这是我的方法:

代码语言:javascript
复制
/*      
 * bits 0-1: Version
 * bit    2: Padding 
 * bit    3: Extension
 * bits 4-7: CC
 */
header[0] = new Integer( (Version << 6)|(Padding << 5)|(Extension << 6)|CC ).byteValue();

/* 
 * bit    0: Marker
 * bits 1-7: PayloadType
 */
header[1] = new Integer( (Marker << 7)|PayloadType ).byteValue();

/* SequenceNumber takes 2 bytes = 16 bits */
header[2] = new Integer( SequenceNumber >> 8 ).byteValue();
header[3] = new Integer( SequenceNumber ).byteValue();

/* TimeStamp takes 4 bytes = 32 bits */
for ( int i = 0; i < 4; i++ )
    header[7-i] = new Integer( TimeStamp >> (8*i) ).byteValue();

/* Ssrc takes 4 bytes = 32 bits */
for ( int i = 0; i < 4; i++ )
    header[11-i] = new Integer( Ssrc >> (8*i) ).byteValue();

有没有其他更好的方法呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-11 03:22:19

我想我会用ByteBuffer

代码语言:javascript
复制
ByteBuffer buf = ByteBuffer.wrap(header);
buf.setOrder(ByteOrder.BIG_ENDIAN);
buf.put((byte)((Version << 6)|(Padding << 5)|(Extension << 6)|CC));
buf.put((byte)((Marker << 7)|PayloadType));
buf.put((short)SequenceNumber);
buf.put(TimeStamp);
buf.put(Ssrc);
票数 6
EN

Stack Overflow用户

发布于 2010-04-11 02:33:53

在Java语言中,您可以直接将int转换为byte,而不必创建Integer对象。需要显式强制转换,因为与int相比,byte的可能值范围更窄。例如:

代码语言:javascript
复制
header[1] = (byte) (Marker << 7 | PayloadType);
票数 2
EN

Stack Overflow用户

发布于 2010-04-11 02:52:32

这样的数据有一个问题。通常协议使用无符号字节,而Java使用有符号字节。因此,为了正确填充字节数组,我通常使用这样的结构:

代码语言:javascript
复制
bytearray[index] = (byte) ((some integer-result calculation) & 0xff);

简单地转换为byte类型将不能正常工作。

更新。这里不需要"& 0xff“。简单的强制转换就可以了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2614446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档