2014-11-14 4 views
0

Я пытаюсь переключить endianess ByteBuffer, но от этого эффектов нет. Что я делаю неправильно? Возможно, моя основная функция отладки неверна?ByteBuffer переключатель endianness

@Override 
public byte[] toBytes(BigDecimal type) { 
    int octets = getOctetsNumber(); 
    BigInteger intVal = type.unscaledValue(); 

    byte[] temp = intVal.toByteArray(); 
    int addCount = octets - temp.length; 

    //  DEBUG 
    ByteBuffer buffer = ByteBuffer.allocate(octets); 
    for(byte b: intVal.toByteArray()){ 
     buffer.put(b); 
    } 
    if (addCount > 0){ 
     for (; addCount > 0; addCount--) { 
      buffer.put((byte)0x00); 
     } 
    } 
    buffer.flip(); 

    buffer.order(ByteOrder.BIG_ENDIAN); 

    return buffer.array(); 
} 

public static void main(String[] arg) { 
    IntegerDatatype intVal = new IntegerDatatype(17); 
    BigDecimal bd = new BigDecimal(32000); 

    byte[] bytes = intVal.toBytes(bd); 
    String out = new String(); 
    for (byte b : bytes) { 
     out += Integer.toBinaryString(b & 255 | 256).substring(1) + " "; 
    } 
    System.out.println(out); 
} 

основные функции печатает это двоичная строка: 01111101 00000000 00000000 00000000 но должны напечатает: 00000000 10111110 00000000 00000000

ответ

1

Вы должны изменить порядок следования байтов перед вводом значения в буфер. Просто переместите строку сразу после выделения размера буфера, и все будет хорошо.

//  DEBUG 
ByteBuffer buffer = ByteBuffer.allocate(octets); 
buffer.order(ByteOrder.BIG_ENDIAN); 
for(byte b: intVal.toByteArray()){ 
    buffer.put(b); 
} 

...

Кроме того, порядок байт это только влияет на порядок байтов больших числовых значений, а не байт, как описано here

+0

Thanks Michael. Я полностью забыл, что утверждение вступит в силу только тогда, когда вы нажимаете многобайтовый тип в буфере. – Constantine

Смежные вопросы