在Python中读取LabVIEW TCP数据(扁平化字符串/数据集群)

在Python中读取LabVIEW TCP数据(扁平化字符串/数据集群),python,tcp,double,ascii,labview,Python,Tcp,Double,Ascii,Labview,我有一个LabVIEW应用程序,在通过TCP/IP传输到我的python应用程序之前,它将一个双精度集群(数组)展平为一个字符串。这是因为TCP/IP只传输字符串 问题是python将字符串读取为一堆无意义的ASCII字符,而我似乎无法将它们解读回原来的双精度数组 如何解释LabVIEW在展平数据字符串后发送的字符串数据。在谷歌数小时之后,我对有用信息的唯一提示是一个名为pyLFDS的PyPI条目,但后来它被删除了。我想记录这个问题和解决方案,这样其他人就有望避免我在谷歌上浪费时间寻找解决方案

我有一个LabVIEW应用程序,在通过TCP/IP传输到我的python应用程序之前,它将一个双精度集群(数组)展平为一个字符串。这是因为TCP/IP只传输字符串

问题是python将字符串读取为一堆无意义的ASCII字符,而我似乎无法将它们解读回原来的双精度数组


如何解释LabVIEW在展平数据字符串后发送的字符串数据。在谷歌数小时之后,我对有用信息的唯一提示是一个名为pyLFDS的PyPI条目,但后来它被删除了。

我想记录这个问题和解决方案,这样其他人就有望避免我在谷歌上浪费时间寻找解决方案

当LabVIEW展平数据时,在本例中是一组双精度数据,它将数据作为一个合并字符串发送,每个双精度数据由8个字节表示。python将其解释为每双精度8个ASCII字符,如下所示

要返回传输的双精度码,您需要依次获取每个8字节的部分,并将ASCII字符转换为其ASCII代码,在Python中使用ord()。 这将为您提供8字节的十进制代码(例如4.8=
[64 19 51]

事实证明,LabVIEW做了很多事情,包括TCP/IP传输,Big-Endian。除非你在使用Big Endian,否则你可能需要改变它。例如,上面的示例将变成
[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,19,64])
我想记录问题和解决方案,这样其他人就有望避免我在谷歌上浪费时间寻找解决方案

当LabVIEW展平数据时,在本例中是一组双精度数据,它将数据作为一个合并字符串发送,每个双精度数据由8个字节表示。python将其解释为每双精度8个ASCII字符,如下所示

要返回传输的双精度码,您需要依次获取每个8字节的部分,并将ASCII字符转换为其ASCII代码,在Python中使用ord()。 这将为您提供8字节的十进制代码(例如4.8=
[64 19 51]

事实证明,LabVIEW做了很多事情,包括TCP/IP传输,Big-Endian。除非你在使用Big Endian,否则你可能需要改变它。例如,上面的示例将变成
[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,19,64])

详细描述了LabVIEW展平数据格式。该文档没有明确描述双精度浮点(DBL类型)是如何表示的,但发现了更多的搜索,这澄清了它们存储在中

不过,以标准文本格式(如XML或JSON)发送数据可能更简单,也更符合未来的需要,这两种格式都由LabVIEW中的内置函数和Python中的标准库模块支持


不使用LabVIEW展平数据与其他程序交换的另一个原因,如果您有选择,被展平的字符串不包括您需要将其转换回原始数据类型的类型描述符-您需要知道数据是什么类型才能对其进行解码。

LabVIEW展平数据格式有详细描述。该文档没有明确描述双精度浮点(DBL类型)是如何表示的,但发现了更多的搜索,这澄清了它们存储在中

不过,以标准文本格式(如XML或JSON)发送数据可能更简单,也更符合未来的需要,这两种格式都由LabVIEW中的内置函数和Python中的标准库模块支持


不使用LabVIEW展平数据与其他程序交换的另一个原因,如果您有选择,被展平的字符串不包括您需要将其转换回原始数据类型的类型描述符-您需要知道数据是什么类型才能对其进行解码。

我理解这并不能解决您的问题,因为您提到您没有能力修改LabVIEW代码。但是,我希望对LabVIEW中通过TCP传输字符串数据的常用方法进行澄清

可以控制通过写入TCP发送的数据字符串的结尾。我建议使用,因为它使您能够在展平数据时选择要使用的字节顺序;big-endian(如果未显示,则默认),native(使用主机ma的字节顺序