我需要能够用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之外的任何第三方库。
答案 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));