解码方法在Python3中抛出错误

2024-09-27 19:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

this other question on decoding a hex string类似,我有一些Python 2.7脚本中的代码,这些代码已经运行了多年。我现在正试图将该脚本转换为Python 3

好的,我很抱歉最初没有发布完整的问题。我希望这能澄清情况

问题是,我正在尝试将一个较旧的Python 2.7脚本转换为Python 3.8。在大多数情况下,转换都正常,但我在转换以下代码时遇到问题:

# get Register Stings
RegString = ""
for i in range(length):
    if regs[start+i]!=0:
        RegString = RegString + str(format(regs[start+i],'x').decode('hex'))

以下是一些支持数据:

regs[start+0] = 20341
regs[start+1] = 29762

我认为我的Python2.7代码正在将这些转换为十六进制,分别为“4f75”和“7442”。然后分别是字符“Ou”和“tB”

在Python 3中,我遇到了以下错误:

'str' object has no attribute 'decode'

我的目标是修改Python3代码,以便脚本生成相同的结果


Tags: 代码脚本stringon情况thisstartquestion
1条回答
网友
1楼 · 发布于 2024-09-27 19:30:49

str(format(regs[start+i],'x').decode('hex'))是一种非常详细和迂回的方法,可以将regs[start:start + length]中的非零整数值转换为bytestring的单个字符(str在Python2中实际上应该被视为一个字节序列)。它首先将整数值转换为十六进制表示形式(字符串),将该十六进制字符串解码为(一系列)字符串字符,然后对结果调用str()(冗余地,该值已经是字符串)。假设regs中的值是0-255(甚至是0-127)范围内的整数,那么在Python 2中,实际上应该使用^{} function

如果要保留循环,请使用chr()(获取str字符串值),或者如果需要二进制值,请使用bytes([...])。因此:

RegString = ""
for codepoint in regs[start:start + length]:
    RegString += chr(codepoint)

RegString = b""
for codepoint in regs[start:start + length]:
    RegString += bytes([codepoint])

由于这实际上是转换整数的序列,因此您可以将整个批次传递给bytes(),并在执行时过滤掉零:

# only take non-zero values
RegString = bytes(b for b in regs[start:start + length] if b)

或随后删除空值:

RegString = bytes(regs[start:start + length]).replace(b"\x00", b"")

如果仍然认为这是一个字符串而不是字节值,则可以然后对其进行解码,使用任何适当的编码(如果整数在0-127范围内,则使用ASCII码,否则使用更具体的编解码器,在Python 2中,此代码生成了bytestring,因此请在代码中查找关于他们可能使用的编码的其他提示).

相关问题 更多 >

    热门问题