我想记录问题和解决方案,以便其他人可以避免我浪费在谷歌上寻找解决方案的时间。
当 LabVIEW 展平数据(在本例中为双精度簇)时,它会将它们简单地作为连接字符串发送,每个双精度均由 8 个字节表示。这被 python 解释为每个双精度 8 个 ASCII 字符,显示为 nonsense in your console。
要返回传输的双精度,您需要依次获取每个 8 字节部分并将 ASCII 字符转换为它们的 ASCII 代码,在 Python 的情况下使用 ord()。
这将为您提供 8 字节的十进制代码(例如 4.8 = [64 19 51 51 51 51 51 51])
事实证明,LabVIEW 可以处理大多数事情,包括 TCP/IP 传输、Big Endian。除非您使用 Big Endian,否则您可能需要更改它。例如上面的例子将变成[51 51 51 51 51 51 19 64]。我将每个双打都放入一个列表中,因此能够使用list(reversed()) 函数来更改字节序。
然后您可以将其转换回双精度。示例python代码:
import struct
b = bytearray([51,51,51,51,51,51,19,64]) #this is the number 4.8
value = struct.unpack('d', b)
print(value) #4.8
这对于更有经验的程序员来说可能是显而易见的,但它让我困惑了好几天。我很抱歉使用 stackoverflow 作为平台通过回答我自己的问题来分享这一点,但希望这篇文章可以帮助下一个正在苦苦挣扎的人。
编辑:请注意,如果您使用的是 Python 2.7.5 之前的版本,那么您可能会发现 struct.unpack() 会失败。使用上面的示例代码替换以下代码对我有用:
b = bytes(bytearray([51,51,51,51,51,51,19,64]))