2016-10-18 35 views
0

我正在使用具有高数据速率的低级协议,因此根据数字范围使用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); 

这是处理这一正确的方法是什么?我将tax都设置为零,以防随机字节悬空。

更新

的文档不是很大。首先,他们将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,我只是在做这个假设。

+4

如果您在讨论binary16 [半精度](https://en.wikipedia.org/wiki/Half-precision_floating-point_format),则不能只需将字节复制到binary32 [单精度](https://en.wikipedia.org/wiki/Single-precision_floating-point_format)。您必须管理转换。我从来没有听说过有关3字节浮点数的东西... – LPs

+0

我同意@LPs在这里。 IEEE-754通常用于表示浮点数。你不能只读一个浮点数的最低'n'个字节,并且假设你已经选择了数字'x'精度。欲了解更多信息,请参阅https://thirum.al/2dk4tx9 – zapstar

+0

C是这种事情的痛苦:UB只是一箭之遥。你肯定会在这里建立一个非常具体的平台:一个3字节的浮点数很时髦。如果我是你,我会考虑几行内联汇编:你有3个字节的寄存器吗? – Bathsheba

回答

-3

可能你的论点是错误的。更改如下:

memcpy (buffer, &t, 2); 

memcpy (&t, buffer, 2); 

HTH

[编辑:澄清所有这些人投票我的回答下来,这个问题确实有参数的错误的方式左右。尝试读取缓冲区,但将其指定为memcpy的目标]

+0

不是downvoter,但从半精度浮点复制字节到单精度浮点数不起作用.... – LPs

+0

@LPs我明白,但OP不知道他为什么得到全零。直到他真的从缓冲区读取数据,他才会知道为什么memcpy不能用于浮动。 – Lelanthran

相关问题