Мне нужно иметь возможность читать с плавающей запятой или удваивать из двоичных данных в C ++, аналогично Python struct.unpack
функция. Моя проблема в том, что данные, которые я получаю, всегда будут в порядке байтов. Я имел дело с этим для целочисленных значений как описано здесь, но работа побайтово не работает со значениями с плавающей запятой. Мне нужен способ для извлечения значений с плавающей запятой (оба 32-разрядных float
с и 64 бит double
s) в 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.
Почему работа побайтовая не работает со значениями с плавающей запятой?
Просто извлеките 32-битное целое число как обычно, а затем интерпретируйте его как число с плавающей точкой: float f = *(float*)&i
И то же самое для 64-битных целых и двойных
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));