逆向工程'UTF-8 Like'编码算法

Reverse Engineering 'UTF-8 Like' Encoding Algorithm

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

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

我目前(并且已经有一段时间)正在努力思考下面列出的 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 功能相反的明显方法?

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

干杯!

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

为了避免长度定长,将长度分成seven-bit个单位,先发送low-order个chunk。每个 seven-bit 单元都在一个单独的 8 位字节中发送,并设置了 high-order 位,但按原样发送的最后一个单元除外。因此,reader 知道它何时到达长度的末尾,因为它读取了一个 high-order 位为 0 的字节(换句话说,一个小于 0x80 的字节)。