解码方法在Python3中抛出错误
与之类似,我有一些Python 2.7脚本中的代码,这些代码已经运行了多年。我现在正试图将该脚本转换为Python 3 好的,我很抱歉最初没有发布完整的问题。我希望这能澄清情况 问题是,我正在尝试将一个较旧的Python 2.7脚本转换为Python 3.8。在大多数情况下,转换都正常,但我在转换以下代码时遇到问题:解码方法在Python3中抛出错误,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,与之类似,我有一些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:
# 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”对象没有“decode”属性
我的目标是修改我的Python3代码,以便脚本生成相同的结果。str(格式(regs[start+i],'x')。decode('hex'))
是一种非常详细和迂回的方法,可以将regs[start:start+length]
中的非零整数值转换为bytestring的单个字符(str
在Python 2中实际上应该被视为字节序列)。它首先将整数值转换为十六进制表示形式(字符串),将该十六进制字符串解码为(一系列)字符串字符,然后对结果调用str()。假设regs
中的值是0-255(甚至是0-127)范围内的整数,那么在Python 2中,实际上应该使用
如果要保留循环,请使用chr()
(获取str
字符串值),或者如果需要二进制值,请使用字节([…])
。因此:
RegString = ""
for codepoint in regs[start:start + length]:
RegString += chr(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,因此请在代码中查找关于他们可能使用的编码的其他提示).如果我们知道regs
中的值的类型,那会更有帮助,更好的是,您包含了一个示例值和预期的输出。作为起点,Python 3中与Python 2“Python 3中的
等价的是b”“
”。Python 3“
是Python 2u”
@chepner:事情从来没有这么简单。根据上下文的不同,Python 2中的“
应该翻译成”
在Python 3中也是如此。这是因为API也发生了变化,而不仅仅是unicode与bytes字符串对象类型。我已经结束了这个问题,因为它不够清楚。我现在把我的答案留到这里,但我已经做出了一些假设,我不确定这些假设是否正确。请提供必要的输入示例和预期的输出(只需使用打印开始、长度、repr(regs)、repr(RegString)
捕获运行中的Python 2脚本中的一些示例值,这样我们就可以获得准确的对象表示形式)。如果您知道这些值应该表示什么(来自Windows注册表的数据、从表示文本或图像的某些源接收的数据等)这也会有帮助。这是一个用法问题,而不是类型问题。识别实际使用的类型是确定应该使用哪些类型的第一步。
RegString = bytes(regs[start:start + length]).replace(b"\x00", b"")