转换缓冲区表示 int little endian Python 类的列表
Posted
技术标签:
【中文标题】转换缓冲区表示 int little endian Python 类的列表【英文标题】:Convert buffer repesents list of int little indian Python class 【发布时间】:2022-01-17 22:39:19 【问题描述】:我正在尝试从缓冲区中获取数据,表示为字符串,
例子:
得到:
str = "0004000001000000020000000A000000"
class MyData:
length
some_data
array_data
buf_data
data = parse(str)
除了:
length=1024, some_data=1, array_data=[2,10], buf_data="000000020000010"
解释:
长度=1024,因为 8 个数字“00040000”代表小印度的十六进制数
其余的想法相同, "00040000 01000000 0200000 00A000000"
1024、1、2、10
有什么想法吗?
我有一些解决方案,但它太乱了,不容易支持
【问题讨论】:
不要描述您的代码,请edit您的问题并显示您的(可能不完整的)代码,最好是minimal reproducible example。 FWIW,那些 little-endian 十六进制数字00040000
、01000000
、02000000
和 0A000000
在我看来像 16384、16、32 和 160。
@SteveSummit 也许,但这是我在使用整个缓冲区的每个字节 print("%02X", DATA) 后获取数据的方式
【参考方案1】:
这是一种方法:
class MyData:
mmap = [16**1, 16**0, 16**3, 16**2, 16**5, 16**4, 16**7, 16**6]
def __init__(self, buffer):
self.buffer = buffer
self.integers = []
def get_integers(self):
if len(self.integers) == 0:
for i in range(0, len(self.buffer), 8):
a = 0
for x, y in zip(self.buffer[i:i+8], self.mmap):
a += int(x, 16) * y
self.integers.append(a)
return self.integers
mydata = MyData('0004000001000000020000000A000000')
print(mydata.get_integers())
输出:
[1024, 1, 2, 10]
注意:这专门用于 32 位无符号值
【讨论】:
非常好!我想知道是否有一些模块可能是 struct module ?因为通过这种方式,它会是这样的:a=func、b = func、c=func,或者至少有一些方法可以在某个 for 循环中初始化类的所有成员? @Itamar 也许你可以改写一下。我不太确定你需要什么 我需要将值很好地提取到我的班级中,并且避免对每个成员进行“硬编码”分配 好的 - 你的班级是什么样的? 类MyData:长度,some_data1,some_data2,some_data3,array_data,buf_data以上是关于转换缓冲区表示 int little endian Python 类的列表的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中解压已签名的 int32 little-endian
将uint32 从little endian转换为char数组(写入文件)
如何正确地将 USC-2 little endian 转换为 UTF-8?
推断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式
将带有 CRLF 行终止符的 Little-endian UTF-16 Unicode 英文文本文件转换为 Ascii 编码