python — читает float и double из двоичных данных в переполнении стека

Мне нужно иметь возможность читать с плавающей запятой или удваивать из двоичных данных в C ++, аналогично Python struct.unpack функция. Моя проблема в том, что данные, которые я получаю, всегда будут в порядке байтов. Я имел дело с этим для целочисленных значений как описано здесь, но работа побайтово не работает со значениями с плавающей запятой. Мне нужен способ для извлечения значений с плавающей запятой (оба 32-разрядных floatс и 64 бит doubles) в C ++, аналогично тому, как вы бы использовали struct.unpack(">f", num) или же struct.unpack(">d", num) в Python.

вот пример того, что я пробовал:

stuct.unpack("d", num) ==> *(double*) str; // if str is a char* containing the data

Это прекрасно работает, если str является прямым порядком байтов, но не, если это порядковый номер, как я знаю, это всегда будет. Проблема заключается в том, что я не знаю, какой будет непосредственный порядковый номер среды, поэтому мне нужно всегда иметь возможность извлекать двоичные данные как big-endian.

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

НОТА Я должен был указать на это ранее, но я не могу использовать c ++ 11 или любые сторонние библиотеки, кроме Boost.

0

Решение

Почему работа побайтовая не работает со значениями с плавающей запятой?
Просто извлеките 32-битное целое число как обычно, а затем интерпретируйте его как число с плавающей точкой: float f = *(float*)&i

И то же самое для 64-битных целых и двойных

0

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

void ByteSwap(void * data, int size)
{
char * ptr = (char *) data;
for (int i = 0;  i < size/2;  ++i)
std::swap(ptr[i], ptr[size-1-i]);
}

bool LittleEndian()
{
int test = 1;
return *((char *)&test) == 1;
}

if (LittleEndian())
ByteSwap(&my_double, sizeof(double));
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector