Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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
如何将字节字符串的Python字符串表示形式转换为实际的字节字符串?_Python_Python 3.x - Fatal编程技术网

如何将字节字符串的Python字符串表示形式转换为实际的字节字符串?

如何将字节字符串的Python字符串表示形式转换为实际的字节字符串?,python,python-3.x,Python,Python 3.x,我试图弄清楚如何将字节字符串的字符串表示形式转换为实际的字节字符串类型。我不太习惯Python(只是为了帮助朋友而对它进行黑客攻击),所以我不确定是否有一些简单的“转换”方法(就像我心爱的Java;)。基本上我有一个文本文件,它的内容是一个字节字符串: b'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4' \x03\xacgB\x16\xf3\xe1

我试图弄清楚如何将字节字符串的字符串表示形式转换为实际的字节字符串类型。我不太习惯Python(只是为了帮助朋友而对它进行黑客攻击),所以我不确定是否有一些简单的“转换”方法(就像我心爱的Java;)。基本上我有一个文本文件,它的内容是一个字节字符串:

b'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'
\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4
我目前在该文件中阅读的内容如下:

aFile = open('test.txt')
x = aFile.read()
print(x) # prints b'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'
print(type(x)) # prints <class 'str'>

如果这样做更容易或更好,我可以使用它。

因为您的输入是Python语法的,出于某种原因(*),这里要做的事情就是调用
eval

>>> r"b'\x12\x12'"
"b'\\x12\\x12'"
>>> eval(r"b'\x12\x12'")
'\x12\x12'
但是要小心,因为这可能是一个安全问题
eval
将运行任何代码,因此您可能需要清理输入。在您的例子中,它很简单-只需检查您正在评估的内容是否确实是一个符合您期望格式的字符串。如果这里没有安全问题,就不用麻烦了

重新编辑:尽管如此,
eval
仍然是这里最简单的方法(如果没有添加
b'
)。当然,您也可以通过将每个
\xXX
转换为其实际值来手动执行此操作


(*)为什么,真的?对于数据表示格式来说,这似乎是一个奇怪的选择

>>> r'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'.decode('string-escape')
'\x03\xacgB\x16\xf3\xe1\\v\x1e\xe1\xa5\xe2U\xf0g\x956#\xc8\xb3\x88\xb4E\x9e\x13\xf9x\xd7\xc8F\xf4'

这将适用于周围没有
b'…'
的字符串。否则,建议您使用
ast.literal\u eval()

原因是我刚刚意识到这完全是白痴。除息的。在播放时存储散列值,没有想到使用
.hexdigest()
而不是
digest()
hexdigest()
当然会给出一个字符串,这个字符串更便于使用。很抱歉用一个愚蠢的问题打扰你。@斯蒂芬:没关系,只要你得到帮助;-)有这样的格式是一种明显的“代码气味”,所以我指出了它out@Stephen:字节很好用,但问题是为什么要将字节的表示形式写入文件而不是字节本身。Python中没有强制转换,这个概念在动态语言中没有意义。都是鸭子打字。如果它看起来像str,走路像str,你就认为它是str。不管怎样,你会如何“铸造”这个呢?如果将其强制转换为str,则会得到一个以b'\x.:)开头的str出于我无法理解的原因,
ast.literal\u eval()
不适用于Python 3.x中的
b'
literals--这就是我删除我的答案的原因。@Sven:奇怪。在2.7版上效果很好。@Sven:嗯,你说得对。你知道有没有公开的bug报告吗?@Sven:literal\u eval显然可以处理3.2中的字节。不知道为什么在那之前它被省略了。它应该是Python3上的
.decode('unicode\u escape')