От 32 + 32 бит к двойному

1

по какой-то причине мне нужно получить двойное значение из двух 32 бит. Позвольте мне объяснить: на стороне сервера они отправляют двойное значение, отформатированное так:

  // C/C++ = SERVER 
  double big;
  big = 12345.67890;
  unsigned int *pi = (unsigned int *)&big;

  unsigned int x = pi[0];
  unsigned int y = pi[1];

они отправляют с сервера клиенту двойной формат с двумя неподписанными int (x и y, 32 бит каждый в моем случае). На стороне клиента (JAVA) мне нужно снова создать двойное значение из двух полученных беззнаковых целых чисел. Я пробовал это без успеха:

// double double64 = buffer2.getDouble();
ByteBuffer buffer = ByteBuffer.allocate(16);
buffer.putLong(my_int_x);
buffer.putLong(my_int_y);
buffer.flip();
double double64 = buffer.getDouble();

возможно, потому что я получаю 32-битное целое число, и я использую "putLong"?

  • 2
    Длинный - 64 бита в Java. Есть ли что-то вроде putInt вы могли бы использовать вместо этого?
  • 0
    @Jorge_B: Я использовал «как это» не случайно ... Я только что отправил код PoC, чтобы попытаться объяснить мою проблему в нескольких строках кода. И, к слову, сервер является мультиплатформенным, а серверы выполняют примерно полмиллиона запросов каждый день ... но спасибо за ваш совет ;-)
Показать ещё 2 комментария
Теги:
endianness
bytebuffer

1 ответ

4
Лучший ответ

Чтобы преобразовать два ints (содержащих двойные данные) в double, вам не нужен временный буфер. Вы можете сделать это:

long doubleBits = my_int_x & 0xFFFFFFFFL;
doubleBits <<= 32;
doubleBits |= my_int_y & 0xFFFFFFFFL;
double myDouble = Double.longBitsToDouble(doubleBits);

Однако проверьте, как вы читаете my_int_x и my_int_y в своей программе Java. Возможно, вы можете получить двойную прямую в тот момент (в идеале, вы должны).

  • 4
    Если, конечно, обе системы используют один и тот же порядок байтов.
  • 0
    Я не вижу здесь никакой проблемы с порядком байтов ... представление с двойным типом является стандартным (IEEE 754), и на стороне Java здесь нет никакого порядка байтов, мы просто копируем два буфера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню