2016-07-13 138 views
1

这不是关于使用UTF-8的解码。这是关于将字节对象作为字面值读取并将其作为字节对象来读取的,而不用重新进行解析过程。如果在那里有我的问题的答案,它隐藏在许多有关解码问题的答案背后。Python 3.4将字节字节字节转换为字节对象

以下是我需要:

x = "bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz')" 
y = ???(x, ???) 
z = bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz') 
if y == z: 
    print ("Yes!") 

如何以取代那些问号有什么建议?

谢谢!

      -- Dave 
+2

修复产生'bytearray'文字的代码可能会更容易,而不是产生更友好的东西。 –

回答

1

一种方法是从X(bytearray(b''))删除所有的混乱,那么我们就每个字符转换为其字节表示,并将其包装成一个bytearray对象。

x = "bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz')" 
y = bytes(ord(c) for c in x[12:-2]) 

下面的第二种方法将不仅限于bytearray,您应该谨慎使用,以防止注射,但如果你确保你的内容是你可以使用这个正确的格式:

x = r"bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz')" 
y = eval(x) 
z = bytearray(b'abc\xd8\xa2\xd8\xa8\xd8\xa7xyz') 

这里您需要在x前加上r"..."以防止反斜线立即将unicode序列插入到x中。因此,可能无法将其与动态内容一起使用,例如字符串来自标准输入或从文件读取。

您还可以使用kindall建议的ast.literal_eval(x[10:-1])

+0

你也可以让python把斜杠作为文字斜线(而不是转义),用'r'作为整个字符串的前缀,就像在'x = r“bytearray(...)中一样('r在这里代表”Raw“上下文) – Delioth

+0

@Delioth谢谢,我不知道! – pascalhein

+2

如果你把它写成'b'...'',你就可以使用'ast.literal_eval()'来获得'bytes'对象,然后就调用'bytearray()'。 – kindall