2017-02-17 22 views
0

Я пытаюсь преобразовать массив байтов в двойное значение.Байт байта Java для двойного преобразования

private static double bytesToDouble(byte[] array) { 
    long l=bytesToLong(array[7],array[6],array[5],array[4],array[3],array[2],array[1],array[0]); 
    return Double.longBitsToDouble(l); 
} 

    private static long bytesToLong(byte b7,byte b6,byte b5,byte b4,byte b3,byte b2,byte b1,byte b0){ 
    //se il byte è signed viene trasf. in unsigned 
    return (b0<0 ? b0+256L : b0)  | 
     ((b1<0 ? b1+256L : b1) << 8) | 
     ((b2<0 ? b2+256L : b2) << 16)| 
     ((b3<0 ? b3+256L : b3) << 24)| 
     ((b4<0 ? b4+256L : b4) << 32)| 
     ((b5<0 ? b5+256L : b5) << 40)| 
     ((b6<0 ? b6+256L : b6) << 48)| 
     ((b7<0 ? b7+256L : b7) << 56); 
} 

В любом случае, кажется, что-то не работает должным образом. Я знаю, что массив вход

-12

И ожидаемое значение 641,5, но я получаю другое значение (-3.591469701136079E-289).

Я знаю, что код, генерирующий последовательность байтов, хорошо работает, потому что он используется в производственной среде с давних пор.

Как я могу манипулировать массивом байтов (или самими байтами) для получения ожидаемого значения?

С уважением

+0

Почему негативов? У меня на самом деле проблема, я задокументировал ее, объясните, а не просто вниз ... –

+0

Отрицательно, возможно, из-за того, что этого часто задают часто. Об ошибке: я предполагаю, что это порядок байтов. Для приятного ответа ниже: вы можете вставить '.order (ByteOrder.LITTLE_ENDIAN)', чтобы изменить порядок по умолчанию. –

+0

Я также попытался изменить массив, все еще не получив ожидаемого результата. Я знаю, что самый простой ответ: «вход неправильный, а не выход», но все остальное в моем декодере работает правильно. –

ответ

1
byte[] bytes = new byte[8]; 
    ByteBuffer.wrap(bytes).putDouble(641.5); 
    System.out.println("Result: " + Arrays.toString(bytes)); 
    // Result: [64, -124, 12, 0, 0, 0, 0, 0] 

Таким образом, порядок байт обратным порядком байтов (Windows Intel), и особенно одно байтовое значение пропало, один read() слишком много; мое предположение глупая ошибка, как:

while (read() != -1) { 
    ... read array 

правильные данные могут быть преобразованы:

double val = ByteBuffer.wrap(array).order(ByteOrder.LITTLE_ENDIAN).getDouble(); 
+0

Спасибо, я проверю полную двоичную строку, содержащую данные , –

+0

Я подтверждаю, что мне приходилось увеличивать на 1 индекс чтения в массиве байтов :) –

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

  • Нет связанных вопросов^_^