我有一个LabVIEW应用程序,它在通过TCP/IP传输到我的python应用程序之前,会将一个双精度数组(数组)展平为一个字符串。它之所以这样做,是因为TCP/IP将只传输字符串。
问题是python将字符串作为一堆无意义的ASCII字符读取,而我似乎无法将它们读回原来的双精度数组。
如何解释LabVIEW在展平数据字符串后发送的字符串数据。在谷歌搜索了几个小时后,我唯一的有用信息是一个名为pyLFDS的PyPI条目,但后来它被删除了。
发布于 2015-10-18 04:01:06
here中对LabVIEW扁平化数据格式进行了较为详细的描述。该文档没有明确描述双精度浮点数(DBL类型)是如何表示的,但是更多的搜索发现了this,它澄清了它们存储在IEEE 754 format中。
但是,以标准文本格式发送数据可能更简单,将来也更有可能。LabVIEW中的内置函数和Python中的标准库模块都支持这两种格式。
不使用LabVIEW扁平化数据与其他程序交换的另一个原因是,扁平化字符串不包括将其转换回原始数据类型所需的类型描述符-您需要知道数据是什么类型才能解码它。
发布于 2015-10-17 16:08:49
我想记录这个问题和解决方案,这样其他人就可以避免我浪费在谷歌上寻找解决方案的时间。
当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())函数来更改字节顺序。
然后,您可以将其转换回double。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作为平台,通过回答我自己的问题来分享这篇文章,但希望这篇文章能帮助下一个正在苦苦挣扎的人。
编辑:注意:如果您使用的是早于Python2.7.5的版本,那么您可能会发现struct.unpack()将失败。使用上面的示例代码替换以下代码对我有效:b = bytes(bytearray([51,51,51,51,51,51,19,64]))
发布于 2018-01-04 00:19:47
这段代码适用于我。UDP服务器接受扁平化的dbl数组x,将x+1返回到端口6503。根据需要修改LabView UDP客户端。
import struct
import socket
import numpy as np
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# doesn't even have to be reachable
s.connect(('10.255.255.255', 1))
IP = s.getsockname()[0]
except:
IP = '127.0.0.1'
finally:
s.close()
return IP
#bind_ip = get_ip()
print("\n\n[*] Current ip is %s" % (get_ip()))
bind_ip = ''
bind_port = 6502
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((bind_ip,bind_port))
print("[*] Ready to receive UDP on %s:%d" % (bind_ip,bind_port))
while True:
data, address = server.recvfrom(1024)
print('[*] Received %s bytes from %s:' % (len(data), address))
arrLen = struct.unpack('>i', data[:4])[0]
print('[*] Received array of %d doubles:' % (arrLen,))
x = []
elt = struct.iter_unpack('>d', data[4:])
while True:
try:
x.append(next(elt)[0])
print(x[-1])
except StopIteration:
break
x = np.array(x)
y = x+1 # np.sin(x)
msg = data[:4]
for item in y:
msg += struct.pack('>d', item)
print(msg)
A = (address[0], 6503)
server.sendto(msg, A)
break
server.close()
print('[*] Server closed')
print('[*] Done')LabView UDP客户端:

https://stackoverflow.com/questions/33184238
复制相似问题