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

时间:2017-12-30 05:54:21

标签: python python-3.x

Python版本:3.5.2
我的代码:

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

我得到了b'\xff'。 我尝试了另一种方式。 Fisrt,我将字节转换为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中的问题。 我该怎么办?

2 个答案:

答案 0 :(得分:3)

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

创建字符串后,用于创建字符串的输入法的详细信息将消失。由于您无法'\t'.replace('t', 'n')获取'\n'的相同原因,您无法执行您要执行的操作。 '\t'不包含“t”;您只需键入“t”作为指定制表符的方法。

答案 1 :(得分: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)