我试图将无符号的int数据从C服务器发送到python客户端。要求是向客户端发送负浮点值。目前这个数字是-5.700,我有2个问题。 1)我不知道如何在uint32_t中保留负面,即使用MSB作为标志位来绕过它。这样好吗?有人有更好的建议吗?
2)我尝试将浮点数5.700转换为uint32_t,即
uint32_t fops = *(uint32_t*)(&float_var) //float_var is 5.700
并且fops被赋值为0x00..40b66666,它被发送到python客户端。现在如何在客户端从此值检索浮动?
更新:正如Mats建议python struct unpacks -ve完美浮动所以不需要使用标志位。
答案 0 :(得分:2)
最简单的解决方案几乎总是最好的:将它作为一个字符串,然后传输它,而不是二进制浮点表示。这样,您不必担心浮点表示的差异或如何使Python“理解”您的二进制浮点值。
Edit1:但是,如果将32位整数传输到Python data
对象:我希望floatdata = struct.unpack("f", data)
可以做到这一点。
Edit2:struct.unpack
(和struct.pack
)
Edit3:struct.unpack
确实假设两台机器使用相同的浮点格式。这意味着该软件不是广泛可移植的。但它应该在大多数常用平台上正常工作。
答案 1 :(得分:1)
C侧的转换只是将4个字节表示浮点数并将其粘贴到fops变量中以进行传输。你以某种方式将它传递给python客户端,它仍然是代表浮点数的4个字节。您可以使用struct模块获取这4个字节并构建一个python float。
(编辑)高位是问题所在。 uint32_t抛出高位并且一旦设置(0xc0b66666)而不是(0x40b66666),它在python中正常工作。因此,您可以手动设置MSB,它应该可以工作。
>>> import struct
>>> buf=struct.pack('i', 0xc0b66666) # this is like the C cast to uint32_t
>>> len(buf)
4
>>> struct.unpack('f', buf)[0]
-5.699999809265137
答案 2 :(得分:0)
您可以使用C数学函数frexpf()
来提取float
的指数和尾数。然后,您可以在Python中使用ldexp()
来重构这两个。
指数作为有符号整数返回,尾数是[.5, 1)
或[-.5, -1)
区间内的带符号浮点数,具体取决于float
的符号。
您决定如何对32位无符号数字进行编码和解码,这取决于您。但是,假设您允许16位用于尾数。然后,您可以将尾数乘以2 15 ,然后使用16位来表示2's complement中结果的舍入整数值。接收器然后可以取16位,转换为有符号整数,并除以2 15 。
32位的其他16位也可用于表示2的补码中的指数。