我正在尝试对编码算法进行逆向工程,以确保与其他软件包的向后兼容性。对于要在输出文件中编码的每种类型的数量,都有一个单独的编码过程。
给定的文档仅向最终用户展示了如何解析编码文件中的值,而不是向其中写回任何内容。但是,我已经能够为除以下文件类型之外的每种文件类型成功创建一个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
功能相反的明显方法?
我将非常感谢任何可能的信息、见解(无论您认为它们多么明显)、帮助或指针,即使这只是指向您认为可能有用的页面的链接。
干杯!