我是一个刚开始学习LabVIEW的重度Python用户。我经常与工业和航空航天设备打交道,我经常需要做的事情是处理一些数据,然后以二进制形式通过某种通信协议导出这些数据。例如,假设我有一个包含struct/cluster/other-complex- data -element的数据包,该数据元素具有以下底层数据元素:
sync -无符号32位整数
time -64位双精度
有效负载ID -16位有符号整数
source -16-但带符号整数
目标-16位有符号整数
有效负载长度- 32位有符号整数
数据1-8位无符号整数
数据2-8位无符号整数
数据3-8位无符号整数
数据4-8位无符号整数
数据4-64位双精度
数据5-32位单字节
数据6- 16位无符号整数
crc -32位无符号整数
(此帧应为42字节长)
我称之为帧,其中有一些报头信息,一个有效载荷,然后是crc,我想这是我正在创建的内容的通用术语。数据类型及其在字节流中的位置至关重要。任何无关或丢失的字节都会破坏数据传输协议,并且数据是不能容忍的。
我的问题是:
如何在Python中轻松实现这一点?在LabVIEW (可能还有其他语言)中,有一些很好的内置函数和方法可以清楚地定义数据类型,然后将它们扁平化成非常有效的字节字符串。似乎在挑选的时候,有些事情是我不明白的。
在我的示例代码中,我有一个简单的函数来获取一些内存信息,然后序列化它。我期望整数版本有88个字节,浮点版本有172个字节,但我得到的分别是87和115字节。这是代码,谢谢你的帮助!
import psutil
import time
import pickle
def getMemoryInfo():
while True:
virtual_memory = psutil.virtual_memory()
swap_memory = psutil.swap_memory()
memoryInfo = list(virtual_memory+swap_memory)
# memoryInfo = [float(x) for x in memoryInfo]
time.sleep(1.000)
print(memoryInfo)
string = pickle.dumps(memoryInfo)
print(string)
print(len(memoryInfo))
print(len(string))
getMemoryInfo()发布于 2021-07-23 07:43:02
struct模块为我工作。它比我希望的要乏味一点,但它工作得很好。下面是我最终使用的代码:
定义负载(build_frame,payload_class,payload_id,build_frame,destination):
# form frame header and payload
frame = {"sync": int(0x64617665),
"absolute_time": time.time(),
"relative_time": time.monotonic(),
"source": int(source),
"destination": int(destination),
"counter": 0,
"payload_class": int(payload_class),
"payload_id": int(payload_id),
"payload_length": int(len(payload)),
"payload": payload}
# form bytearray to crc
sync = (struct.pack('<I', frame['sync']))
absolute_time = (struct.pack('<d', frame['absolute_time']))
relative_time = (struct.pack('<d', frame['relative_time']))
source = (struct.pack('i', frame['source']))
destination = (struct.pack('i', frame['destination']))
counter = (struct.pack('I', frame['counter']))
payload_class = (struct.pack('i', frame['payload_class']))
payload_id = (struct.pack('i', frame['payload_id']))
payload_length = (struct.pack('i', frame['payload_length']))
payload_bytes = frame['payload']
crc_bytes = sync + absolute_time + relative_time + source + destination + counter + payload_class + payload_id + payload_length + payload_bytes
# crc bytes and add to frame
frame['crc'] = binascii.crc32(crc_bytes)
return framehttps://stackoverflow.com/questions/68489924
复制相似问题