Заполнение массива байтов в Java

Для части проекта я продолжаю работать, я реализую RTPpacket, где я должен заполнить массив заголовка байта с полями заголовка RTP.

  //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 ];

Это было моим подходом:

/*      
 * 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();

Кто-либо другой, возможно, 'лучшие' способы сделать это?

5
задан G M Ramesh 26 September 2012 в 13:54
поделиться

4 ответа

Думаю, я бы использовал ByteBuffer

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
ответ дан 14 December 2019 в 04:33
поделиться

Есть одна проблема с такими данными. Обычно протоколы используют здесь беззнаковые байты, а Java имеет подписанные байты. Итак, для правильного заполнения байтового массива я обычно использую такую ​​конструкцию:

bytearray[index] = (byte) ((some integer-result calculation) & 0xff);

Простое приведение к байтовому типу работать некорректно.

Обновление. "& 0xff" здесь не нужен. Подойдет простой гипс.

0
ответ дан 14 December 2019 в 04:33
поделиться

в дополнение к представленным ответам попробуйте Preon

0
ответ дан 14 December 2019 в 04:33
поделиться

Вы можете преобразовать int непосредственно в byte в Java, без необходимости создавать объект Integer. Явное приведение необходимо, поскольку байт имеет более узкий диапазон возможных значений, чем инт. Например:

header[1] = (byte) (Marker << 7 | PayloadType);
2
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: