0

我试图将无符号整数数据从 C 服务器发送到 python 客户端。要求是向客户端发送一个负浮点值。目前这个数字是 -5.700,我有 2 个问题。1)我不知道如何在 uint32_t 中保留负性,我使用 MSB 作为标志位来解决它。这样好吗?有没有人有更好的建议?

2)我尝试将float 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 可以完美浮动,因此无需使用标志位。

4

3 回答 3

2

最简单的解决方案几乎总是最好的:把它变成一个字符串,然后传输它,而不是二进制浮点表示。这样,您就不必担心浮点表示的差异或如何让 Python “理解”您的二进制浮点值。

Edit1:但是,如果您将 32 位整数传输到 Pythondata对象:我希望 floatdata = struct.unpack("f", data)可以解决问题。

Edit2:(struct.unpackstruct.pack)的文档

Edit3:struct.unpack确实假设两台机器都使用相同的浮点格式。这意味着该软件不能广泛移植。但它在最常用的平台上应该可以正常工作。

于 2013-08-23T23:38:04.413 回答
1

C 端的转换只是将代表浮点数的 4 个字节放入 fops 变量中进行传输。您以某种方式将其传输到 python 客户端,它仍然是代表浮点数的 4 个字节。您可以使用 struct 模块获取这 4 个字节并构建一个 python 浮点数。

(编辑)高位是问题所在。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
于 2013-08-23T23:48:10.547 回答
0

您可以使用 C 数学函数frexpf()来提取float. 然后,您可以ldexp()在 Python 中使用来重组这两者。

指数作为有符号整数返回,尾数是区间[.5, 1)或中的有符号浮点数[-.5, -1),具体取决于 的符号float

您决定如何在 32 位无符号数之间编码和解码此信息取决于您自己。但是,假设您允许尾数使用 16 位。然后,您可以将尾数乘以 2 15,然后使用 16 位来表示结果在2 的补码中的舍入整数值。然后接收器可以获取 16 位,转换为有符号整数,然后除以 2 15

32 位中的其他 16 位也可用于表示 2 的补码中的指数。

于 2013-08-23T23:31:23.657 回答