替换不在Python 3中工作的字节

问题描述 投票:1回答:2

Python版本:3.5.2 我的代码:

a = b"\xff"
b = a.replace(b"f", b"d")
print(b)

我得到了b'\xff'。我尝试了另一种方式。首先,我将字节转换为str,然后替换字符串。

a = b"\xff"
b = a.decode()
b = b.replace("f", "d")

但通过例外:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

我不知道如何解决python3中的问题。我该怎么办?

python python-3.x
2个回答
3
投票

b"f"没有b'\xff'。你键入一个“f”来输入b'\xff',但这只是几种输入方法中的一种;该值与bytes([255])相同。 .replace只替换字符串中实际的字节;它不知道你是如何创建字符串的。

创建字符串后,用于创建字符串的输入方法的详细信息将消失。你不能做你想要做的事情,因为你不能做'\t'.replace('t', 'n')得到'\n''\t'不包含“t”;您只需键入“t”作为指定制表符的方法。


1
投票

我假设你试图用f替换\xff中的d来获得\xdd。你不能使用函数string.replace(),因为你不能调用"\t".replace("t", "n")并获得\nBrenBarn已经指出了。你可以做的一件事是使用\\xff而不是\xff,虽然我不知道这是否适合你。这是您的代码中的样子:

a = b"\\xff"
b = a.replace(b"f", b"d")
print(b)

哪个会输出\\xdd。如果这不是一个选项,我会建议你自己做功能。我将告诉你如何做到这一点只是为了让你走上正轨,但为了简单起见,我将假设你只处理一个字符输入。你不能简单地用f替换d的原因是因为首先没有实际的f,所以你的函数必须从将字符转换为\\xff开始。然后你会继续用f替换d。这是代码中的样子:

def convertHexToString(char):
    return "\\x" + str(hex(ord(char)))[2:]

a = convertHexToString("\xff")
b = a.replace("f", "d")
print(b)

哪个会输出\xdd。请注意,输出是\\xdd而不是\xdd,尽管它看起来像。为了把它变成那样,你必须做这样的事情:

def convertStringToHex(string):
    return bytes(string, “utf-8").decode("unicode_escape")

所以,你的最终程序看起来像这样:

def convertHexToString(char):
    return "\\x" + str(hex(ord(char)))[2:]

def convertStringToHex(string):
    return bytes(string, "utf-8").decode("unicode_escape")

# Here we are changing the f's to d's
a = convertHexToString("\xff")  # \\xff
b = a.replace("f", "d")         # \\xdd
print(b)

# Here we are converting the string '\\xdd' into '\xdd'
b = convertStringToHex(b)
© www.soinside.com 2019 - 2024. All rights reserved.