我正在使用具有高数据速率的低级协议,因此根据数字范围使用2或3字节来表示float
使系统更高效。将2个字节或3个字节转换为C中的浮点型号
我试图解析这些数字,但我得到的值对我来说没有意义,它们都是零,我不认为该设备会为有问题的变量输出零。
第5周在我的缓冲区的字节是:FF-FF-FF-FF-FF
前两个字节组成一个float t
。应该指出的是,文件说这些字节是小尾数。
为了解析t
我做的:
float t = 0;
memcpy(buffer, &t, 2);
接下来的3个字节组成float ax
,解析,我这样做:
float ax = 0;
memcpy(buffer+2, &ax, 3);
这是处理这一正确的方法是什么?我将t
和ax
都设置为零,以防随机字节悬空。
更新
的文档不是很大。首先,他们将Float
定义为32-bit IEEE 754 floating-point number
。
然后是这句话:
To increase efficiency many of the data packets are sent as 24-bit signed integer words
because 16-bits do not provide the range/precision required for many of the quantities,
whereas 32-bit precision makes the packet much longer than required.
然后是其中t
定义为前2个字节的缓冲器的表中。它指出范围是0-59.999。它并没有明确说它是一个Float
,我只是在做这个假设。
如果您在讨论binary16 [半精度](https://en.wikipedia.org/wiki/Half-precision_floating-point_format),则不能只需将字节复制到binary32 [单精度](https://en.wikipedia.org/wiki/Single-precision_floating-point_format)。您必须管理转换。我从来没有听说过有关3字节浮点数的东西... – LPs
我同意@LPs在这里。 IEEE-754通常用于表示浮点数。你不能只读一个浮点数的最低'n'个字节,并且假设你已经选择了数字'x'精度。欲了解更多信息,请参阅https://thirum.al/2dk4tx9 – zapstar
C是这种事情的痛苦:UB只是一箭之遥。你肯定会在这里建立一个非常具体的平台:一个3字节的浮点数很时髦。如果我是你,我会考虑几行内联汇编:你有3个字节的寄存器吗? – Bathsheba