Сериализация с плавающей точкой в ​​байты, когда уже предполагается, что __STDC_IEC_559__

Если я проверю свой код со следующим:

#ifndef __STDC_IEC_559__
#error Warning: __STDC_IEC_559__ not defined. The code assumes we're using the IEEE 754 floating point for binary serialization of floats and doubles.
#endif

…такой как описано Вот, я гарантированно что это:

float myFloat = ...;
unsigned char *data = reinterpret_cast<unsigned char*>(&myFloat)

unsigned char buffer[4];
std::memcpy(&Buffer[0], data, sizeof(float));

…безопасно сериализовать float для записи в файл или сетевой пакет?

Если нет, то как я могу безопасно сериализовать поплавки и дубли?

Кроме того, кто отвечает за порядок байтов — мой код или операционную систему?

Чтобы прояснить мой вопрос: могу ли я приводить числа с плавающей запятой к 4 байтам и удваивать к 8 байтам, и безопасно сериализовывать файлы и файлы или между сетями, если я:

  1. Утверждают, что мы используем IEC 559
  2. Преобразовать полученный в / из стандартного порядка байтов (например, порядок байтов в сети).

1

Решение

__STDC_IEC_559__ это макрос, определенный C99 / C11, я не нашел ссылки на то, гарантирует ли C ++ его поддержку.

Лучшее решение — использовать std::numeric_limits< float >::is_iec559 или же std::numeric_limits< double >::is_iec559

C ++ 11 18.2.1.1 Шаблон класса numeric_limits

static const bool is_iec559;

52 Истинно, если и только если тип соответствует стандарту IEC 559.210)

53 Имеет значение для всех типов с плавающей запятой.

В сноске:

210) Стандарт 559 Международной электротехнической комиссии соответствует стандарту IEEE 754.

Что касается вашего второго предположения, я не думаю, что вы можете сказать, что какой-либо порядок байтов является «стандартным», но если порядок байтов одинаков между машинами (с прямым или младшим порядком байтов), то да, я думаю, что вы можете сериализовать таким образом.

2

Другие решения

Как насчет стандартной сериализации, такой как XDR [используется в Unix RPC] или CDR и т. Д.?

http://en.wikipedia.org/wiki/External_Data_Representation

например :
bool_t xdr_float (XDR * xdrs, float * fp); с linux.die.net/man/3/xdr

или библиотека с ++
http://xstream.sourceforge.net/

Вы также можете быть включены в CDR [используется CORBA], ACE [адаптивная коммуникационная среда] имеет классы CDR [но его очень тяжелая библиотека]

1

По вопросам рекламы [email protected]