将负浮点数转换为unsigned int

时间:2013-08-23 22:32:57

标签: python c sockets unsigned

我试图将无符号的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完美浮动所以不需要使用标志位。

3 个答案:

答案 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的补码中的指数。