0

我正在尝试对编码算法进行逆向工程,以确保与其他软件包的向后兼容性。对于要在输出文件中编码的每种类型的数量,都有一个单独的编码过程。

给定的文档仅向最终用户展示了如何解析编码文件中的值,而不是向其中写回任何内容。但是,我已经能够为除以下文件类型之外的每种文件类型成功创建一个write_int()对应read_int()文件read_string()

我目前(并且已经有一段时间)努力弄清楚read_string()下面列出的函数中到底发生了什么。

我完全理解这是一个掩码问题,并且第一个操作while partial_length & 0x80 > 0:是一个简单的按位掩码,它要求我们仅在检查大于 128 的值时才进入循环,当我试图从该while语句内的循环。我得到了操作背后的数学机制,但我不明白为什么他们会以这种方式做事。

我已经包含了read_byte()上下文函数,因为它在read_string()函数中被调用。

def read_byte(handle):
    return struct.unpack("<B", handle.read(1))[0]

def read_string(handle):
    total_length = 0
    partial_length = read_byte(handle)
    num_bytes = 0
    while partial_length & 0x80 > 0:
        total_length += (partial_length & 0x7F) << (7 * num_bytes)
        partial_length = ord(struct.unpack("c", handle.read(1))[0])
        num_bytes += 1
    total_length += partial_length << (7 * num_bytes)
    result = handle.read(total_length)
    result = result.decode("utf-8")
    if len(result) < total_length:
        raise Exception("Failed to read complete string")
    else:
        return result

这是否表明由于信息丢失而无法完成任务,还是我错过了执行与此read_string功能相反的明显方法?

我将非常感谢任何可能的信息、见解(无论您认为它们多么明显)、帮助或指针,即使这只是指向您认为可能有用的页面的链接。

干杯!

4

1 回答 1

0

它只是读取一个长度,然后告诉它要读取多少个字符。(最后我没有收到支票,但这是一个不同的问题。)

为了避免长度固定,将长度分为七位单元,先发送低位块。除了最后一个按原样发送的单元外,每个 7 位单元都以单个 8 位字节的高位设置发送。因此,阅读器知道它何时到达长度的末尾,因为它读取了一个高位为 0 的字节(换句话说,一个小于 0x80 的字节)。

于 2022-02-23T01:23:06.467 回答