转换缓冲区表示 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 十六进制数字 0004000001000000020000000A000000 在我看来像 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

将little-endian转换为ASCII

将uint32 从little endian转换为char数组(写入文件)

如何正确地将 USC-2 little endian 转换为 UTF-8?

推断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式

将带有 CRLF 行终止符的 Little-endian UTF-16 Unicode 英文文本文件转换为 Ascii 编码