我正在使用 HIDAPI 向 USB 设备发送一些数据。这些数据只能以 byte 数组的形式发送,并且我需要在这个数据数组中发送一些 float
数字。我知道浮点数有 4
个字节。所以我想这样做可能会有效:
float f = 0.6;
char data[4];
data[0] = (int) f >> 24;
data[1] = (int) f >> 16;
data[2] = (int) f >> 8;
data[3] = (int) f;
后来我所要做的就是:
g = (float)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]) );
但是测试结果显示,类似于data[0] = (int) f >> 24;
这样的行总是返回0
。我的代码有什么问题,我该如何正确地执行它(即将一个float
内部数据分成4个char
字节,并稍后重新构建相同的float
)?
编辑:
我用以下代码成功实现了这一点:
float f = 0.1;
unsigned char *pc;
pc = (unsigned char*)&f;
// 0.6 in float
pc[0] = 0x9A;
pc[1] = 0x99;
pc[2] = 0x19;
pc[3] = 0x3F;
std::cout << f << std::endl; // will print 0.6
和
*(unsigned int*)&f = (0x3F << 24) | (0x19 << 16) | (0x99 << 8) | (0x9A << 0);
我知道memcpy()
是更"干净"的方式,但我认为这种方式性能会更好。
(int)f >> 24
返回0
的原因是,强制转换为int
的f
在第一次就等于了0
:强制转换将浮点数向下取整。这是未定义的行为,但要以这种 hacky 的方式做到这一点,您需要像*(int*)&f >> 24
这样的东西。 - Andrey Mishchenko