У меня есть большая проблема с ответом на этот вопрос Swap bits in c++ for a doubleКак управлять порядок байтов в два раза от сети
Тем не менее, этот вопрос более или менее то, что я ищу: я получаю двойной от сети и I хотите правильно закодировать его на моей машине.
В случае я получаю int
я выполнить этот код с помощью ntohl
:
int * piData = reinterpret_cast<int*>((void*)pData);
//manage endianness of incomming network data
unsigned long ulValue = ntohl(*piData);
int iValue = static_cast<int>(ulValue);
Но в случае я получаю double
, я не знаю, что делать.
Ответ на этот вопрос предлагаю сделать:
template <typename T>
void swap_endian(T& pX)
{
char& raw = reinterpret_cast<char&>(pX);
std::reverse(&raw, &raw + sizeof(T));
}
Однако, если я процитирую this site:
The ntohl() function converts the unsigned integer netlong from network byte order to host byte order. When the two byte orders are different, this means the endian-ness of the data will be changed. When the two byte orders are the same, the data will not be changed.
напротив @ ответ GManNickG на вопрос всегда делает инверсия с std::reverse
.
Я ошибаюсь, полагая, что этот ответ неверен? (в рамках сетевого управления endianess, использование которого ntohl
предполагает, хотя это не было точно указано в названии вопроса OP).
В конце концов: Должен ли я разделить мой double
на две части по 4 байта и применить функцию ntohl
на две части? Есть ли еще канонические решения?
Существует также этот интересный вопрос в C, host to network double?, но он ограничивает значения 32 бита. И ответ говорит, что двойники должны быть преобразованы в строки из-за различий в архитектуре. Я также собираюсь работать со звуковыми образцами, должен ли я действительно рассмотреть возможность преобразования всех образцов в строки в моей базе данных? (двойники поступают из базы данных, которую я запрашиваю по сети)
Нередко бывает, что данные хранятся в локальной базе данных, отличные от способа передачи данных по сетевому протоколу. Существует ли требование, чтобы сериализация данных была эквивалентной? – franji1
Не можете ли вы объединить два решения, с которыми вы связаны? 'uint32_t foo = 1; if (htonl (foo)! = Foo) {/ * Решение GMan идет здесь * /} else {/ * возвращать немодифицированный аргумент * /} '. Кроме того, второй ответ правилен в том, что представления чисел с плавающей запятой являются не переносимыми, даже если это не проблема. Так вы должны преобразовать в строку или использовать для этого какую-то специальную библиотеку? Ответ зависит от того, насколько портативен этот код. – Praetorian
@Praetorian, поэтому я должен думать об этом ... –