0

我需要能够从 C++ 中的二进制数据中读取浮点数或双精度数,类似于 Python 的struct.unpack函数。我的问题是我收到的数据总是大端的。我已经处理了这里描述的整数值,但是逐字节工作不适用于浮点值。我需要一种在 C++ 中提取浮点值(32 位float和 64 位double)的方法,类似于您在 Python 中的使用struct.unpack(">f", num)方式。struct.unpack(">d", num)

这是我尝试过的一个例子:

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

如果是 little-endian,那效果很好str,但如果它是 big-endian,就不行,因为我知道它永远都是。问题是我不知道环境的原生字节序是什么,所以我需要能够始终将二进制数据提取为大字节序。

如果您查看链接的问题,您会发现这很容易对整数值使用按位或移位,但该方法不适用于浮点。

注意我应该早点指出这一点,但我不能使用 c++11 或 Boost 以外的任何第三方库。

4

2 回答 2

0

为什么逐字节工作不适用于浮点值?只需像往常一样提取 32 位整数,然后将其重新解释为浮点数:float f = *(float*)&i

对于 64 位整数和双精度数也是如此

于 2012-12-14T15:20:30.390 回答
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));
于 2012-12-14T17:38:58.520 回答