2015-08-04 2 views
1

У меня есть следующий многобайтовая представленный в шестнадцатеричном формате:поменяв порядок многобайтовой

0xdc, 0xd3 

Я могу обрабатывать байты в прямом порядке байт() формат, чтобы получить десятичное значение 54236:

List<Integer> packet = new LinkedList<Integer>(Arrays.asList(0xdc, 0xd3)); 
int idx=0; 
int rpm = (int)readBytes(packet, idx, 2); 

private long readBytes(List<Integer> packet, int idx, int size){ 
    long val=0; 
    int element; 

    for(int i=0;i<size;i++, idx++){ 
     element = packet.get(idx); 
     val |= element << (8 * i); 
    } 

    return val; 
} 

Описанный выше метод дает значение, как ожидалось. Однако, теперь я хочу, чтобы получить значение в обратном порядке (большой формат обратный порядок байт), но это дает мне некоторые сумасшедшие значение 14471936:

private long bigEndianReadBytes(List<Integer> packet, int idx, int size){ 
    long val=0; 
    int element; 

    for(int i=size;i>0;i--, idx++){ 
     element = packet.get(idx); 
     val |= element << (8 * i); 
    } 

    return val; 
} 

Что может быть не так с этим методом?

ответ

1

Петля for в методе bigEndianReadBytes() должна начать путем сдвига size - 1 байт, и конца сдвигая нулевые байты (в последней итерации). В настоящее время вы смещаете size байт на первой итерации и один байт в последней итерации. Попробуйте этот код вместо:

for (int i=size-1; i >= 0; i--, idx++) { 
    element = packet.get(idx); 
    val |= element << (8 * i); 
} 
2

С @TimBiegeleisen ответом (+1), у вас есть хороший «ручной» код для преобразования байт значений.

Рассматривали ли вы с помощью ByteBuffer? Он делает все это для вас и работает как с Big Endian, так и с Little Endian.

public static void main(String[] args) throws Exception { 
    ByteBuffer bb = ByteBuffer.allocate(2); 
    bb.put(new byte[] {(byte)0xdc, (byte)0xd3}); 
    System.out.println(bb.order(ByteOrder.BIG_ENDIAN).getShort(0) & 0xFFFF); 
    System.out.println(bb.order(ByteOrder.LITTLE_ENDIAN).getShort(0) & 0xFFFF);  
} 

AND ИНГ результат против 0xFFFF поэтому short результата стимулируется к int, в противном случае результат является отрицательным числом, потому что Java работает с подписанными типами данных.

Результаты:

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