首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中扁平化或序列化数据以使其仅包含数据字节的适当方式是什么?

在Python中扁平化或序列化数据以使其仅包含数据字节的适当方式是什么?
EN

Stack Overflow用户
提问于 2021-07-23 02:31:55
回答 1查看 39关注 0票数 0

我是一个刚开始学习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字节。这是代码,谢谢你的帮助!

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2021-07-23 07:43:02

struct模块为我工作。它比我希望的要乏味一点,但它工作得很好。下面是我最终使用的代码:

定义负载(build_frame,payload_class,payload_id,build_frame,destination):

代码语言:javascript
复制
# 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 frame
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68489924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档