从C ++中的二进制数据中读取float和double

时间:2012-12-14 15:11:48

标签: c++ python floating-point binary endianness

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

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

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

如果str是小端的话,这样可以正常工作,但如果它是大端的话,那就不行了,因为我知道它永远都是。问题是我不知道环境的本地字节序是什么,因此我需要能够始终将二进制数据提取为大端。

如果查看链接的问题,您会发现这很容易使用bitwise-ors和bitshifts来表示整数值,但该方法不适用于浮点数。

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

2 个答案:

答案 0 :(得分:0)

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

64位整数和双倍

相同

答案 1 :(得分: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));