如何通过结构将返回的数据格式化



我正在将其发送到服务器:

import requests 
response = requests.get('http://SERVER-IP/get.cgi?req=zones')
print(response.content)

我得到一个字符串数据如下:

b'CSx01x00x00x00x01x00MainAuditoriumx00x00x00x00x01x00x03x00x00x00x01x00x00x00'

在网站上,它列出了一个可变长度结构

typedef struct ZonesData {
uint16_t            signature;              // Signature = 'CS'
int16_t             version;                // Version = 0x0001 (or negative error code)
uint8_t             reserved[2];            // -
uint16_t            zoneCount;              // Number of zones
ZoneRecord          zones[];                // Variable array of zone records
} ZonesData;
#define STACK_NAME_BUF_SIZE     16
typedef struct ZoneRecord {
char                name[STACK_NAME_BUF_SIZE];  // Name of zone
uint8_t             playbackIndex;          // Playback index
uint8_t             joinGroup;              // Join group
uint16_t            count;                  // Number of PresetID/Status pairs
uint32_t            data[];                 // Array of PresetID/Status pairs (32 pairs max)
} ZoneRecord;
  1. 如何让python以人类可读的形式编写代码?

  2. 可以使用返回的整数来表示更新UI上的按钮吗?我假设我可以,我只是不确定我会引用整数还是人类可读的整数。

附加项目上下文:我正在尝试集成Qsys和Cueserver,以便当从Cueserver墙站启动新预设时,Qsys触摸板按钮会更新。

我和我的妹夫在这个周末做了一些工作,他想出了这个。。。。我仍在计算他到底做了什么,以便我可以修改它以获得更多的回应。您可以要求服务器返回一堆不同的字符串(所有字符串都是相同的原始格式(。看起来我必须为每一个单独的响应编码。。。

import requests
import struct
from collections import namedtuple
PresetStatusPair = namedtuple('PresetStatusPair', 'preset status')
class ZoneData:
def __init__(self, data, offset):
self.size = 20
self.name, self.playback_index, self.join_group, count = struct.unpack_from("16sBBH", data, offset)
self.name = str(self.name, 'ascii')
self.data = []
for i in range(count):
unpacked = struct.unpack_from("II", data, offset + self.size)
self.data.append(PresetStatusPair._make(unpacked))
self.size += 8

class ZonesData:
def __init__(self, data):
if len(data) == 4:
raise Exception("CS internal error")
self.signature, self.version, zone_count_unused = struct.unpack_from("2sHxxH", data)
self.signature = str(self.signature, 'ascii')
self.parse_zone_records(data)
def parse_zone_records(self, data):
self.zone_records = []
offset = 8
while offset < len(data):
zone_data = ZoneData(data, offset)
offset += zone_data.size
self.zone_records.append(zone_data)

zones_data = ZonesData(data)
print(f"signature: {zones_data.signature}")
print(f"version  : {zones_data.version}")
print(f"records  :")
for record in zones_data.zone_records:
print(f"    name          : {record.name}")
print(f"    playback_index: {record.playback_index}")
print(f"    join_group    : {record.join_group}")
print(f"    data          : {record.data}")

相关内容

  • 没有找到相关文章

最新更新