Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解码方法在Python3中抛出错误_Python_Python 3.x_Python 2.7 - Fatal编程技术网

解码方法在Python3中抛出错误

解码方法在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:

与之类似,我有一些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”对象没有“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 2
u”
@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"")