Лучший способ сериализации Float в Java для чтения приложением C ++? - PullRequest
4 голосов
/ 11 августа 2009

Мне нужно сериализовать Java-Float для чтения приложением, написанным на C ++ через Socket comms. Есть ли для этого стандарт? Было бы проще использовать метод floatToIntBits в классе Float, однако я не уверен, насколько он стандартен.

Ответы [ 3 ]

7 голосов
/ 11 августа 2009

Это на самом деле довольно стандартно. Функция floatToIntBits выдает фактические байты кодировки IEEE с плавающей точкой. Единственная проблема заключается в том, что байты будут с прямым порядком байтов, поэтому вам придется изменить порядок байтов при чтении в ваше приложение C ++. (если ваша платформа C ++ также не является байтовым порядком байтов!)

6 голосов
/ 11 августа 2009

Используйте Float.floatToIntBits() (или Float.floatToRawIntBits(), если вы хотите сохранить значения NaN), чтобы преобразовать число с плавающей точкой в ​​целое число. floatToIntBits() указано для возврата целого числа в формате IEEE 754, который используется практически всеми реализациями C / C ++. Затем вы должны преобразовать целое число в байтовый массив в порядке сетевых байтов (big-endian), который затем можно безопасно сериализовать в файл, сокет, поток байтов и т. Д.:

int floatBits = Float.floatToIntBits(myFloat);
byte floatBytes[] = new byte[4];
floatBytes[0] = (byte)(floatBits >> 24);
floatBytes[1] = (byte)(floatBits >> 16);
floatBytes[2] = (byte)(floatBits >> 8);
floatBytes[3] = (byte)(floatBits);
0 голосов
/ 11 августа 2009

Если вам действительно не нужно, чтобы он был двоичным, по причинам пропускной способности или скорости, лично я просто преобразовал бы его в строку. Это позволяет избежать всевозможных проблем с двоичной совместимостью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...