Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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 字节()和b'之间的差异';_Python_Python 3.x_Bytestream - Fatal编程技术网

Python 字节()和b'之间的差异';

Python 字节()和b'之间的差异';,python,python-3.x,bytestream,Python,Python 3.x,Bytestream,我有以下str: “\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb0\urootkit.com\u63k.txt” 这来自一个文件名:(*.ааааааааRootKit.comаu 63k.txt 我的问题是a无法将第一个str反转为第二个。我尝试了一些方法,使用了en/decode(),bytes()等,但没有成功 我注意到b''和bytes()有不同的输出: pa

我有以下
str

“\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb0\urootkit.com\u63k.txt”

这来自一个文件名:
(*.ааааааааRootKit.comаu 63k.txt

我的问题是a无法将第一个
str
反转为第二个。我尝试了一些方法,使用了
en/decode()
bytes()
等,但没有成功

我注意到b''和bytes()有不同的输出:

path=“\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xba\xd0\xb0\urootkit.com\u63k.txt”
bpath=字节(路径,“UTF-8”)
打印(路径解码(“UTF-8”))
打印(b“\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb0\urootkit.com\u63k.txt”。解码('utf8'))
结果:

РаÑÑиÑ
         Ñовка_RootKit.com_63k.txt
Расшифровка_RootKit.com_63k.txt

所以我想知道
b'
bytes()
之间的区别是什么;也许它会帮助我解决我的问题

path
变量是字符串(不是字节)。 当您使用
bytes()
方法时,您正在将其解码为字节,将返回
b'\xc3\xc2\xc3\x90\xc2\xb0\xc3\x91\xc2\x81\xc3\x91\xc2\x88\xc3\xc3\x91\xc2\x84\xc3\x91\xc2\x80\xc3\x90\xc2\xc2\xc3\xc3\x90\xc2\xc2\xc3\xc90\xc2\xc2\xc3\xc90\xc90\xc2\xc90\xc3\xc90\xc90\xc2\xc2\xxc0\xcu\xcu\xc0\xc0\xc\xxx

但是当你在写
b”\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\xd1\x80\xd0\xbe\xd0\xb2\xb0\xb0\xb0\RootKit.com\u 63k.txt“
你指的是
,这将导致以下字符串被解释为
字节
类型的对象。
bytes
函数获取一个字符串并返回一个
bytes
对象

print(b"\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb0_RootKit.com_63k.txt".decode
这是可行的,因为您正在解码字节对象

path = "\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb0_RootKit.com_63k.txt"
bpath = bytes(path, "UTF-8")
print(bpath.decode("UTF-8"))
这并没有达到预期的效果,因为您将
path
视为一个字符串,然后将其转换为一个bytes对象,然后尝试解码结果

您可能希望将solution与
latin1一起使用,请首先滚动到该答案。如果您不小心复制了字节内容并粘贴为字符串,则此答案有效

如果要将它们转换回字节,请使用以下代码:

In [22]: path = "\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb0_RootKit.com_63k.txt"

In [23]: bytes(map(ord, path)).decode('utf-8')
Out[23]: 'Расшифровка_RootKit.com_63k.txt'
解释很简单,让我们使用字符串中的第一个字符:

In [40]: '\xd0'
Out[40]: 'Ð'

In [41]: b'\xd0'
Out[41]: b'\xd0'
如您所见,字符串将
\xd0
转换为带有数字
0xd0
的unicode字符,而字节仅将其解释为单个字节

UTF-8对
U+0080
U+07FF
之间的所有字符使用以下掩码:
110xxxxx
用于第一个字节,而
10xxxxxx
用于第二个字节。这正是直接将该字符串转换为字节时得到的结果:

In [43]: [bin(x) for x in '\xd0'.encode('utf-8')]
Out[43]: ['0b11000011', '0b10010000']
In [46]: bytes(map(ord, path)).decode('utf-8')
Out[46]: 'Расшифровка_RootKit.com_63k.txt'
而实际符号代码是
00011
+
010000
(串联,而不是加法),即
0xd0

In [44]: hex(int('00011010000', 2))
Out[44]: '0xd0'
要从字符中获取此数字,我们可以使用
ord

In [45]: hex(ord('\xd0'))
Out[45]: '0xd0'
然后将其应用于整个字符串并将其转换回字节:

In [43]: [bin(x) for x in '\xd0'.encode('utf-8')]
Out[43]: ['0b11000011', '0b10010000']
In [46]: bytes(map(ord, path)).decode('utf-8')
Out[46]: 'Расшифровка_RootKit.com_63k.txt'
请注意,如果由于某种原因字符串不适合字节,则上述代码将引发错误:

In [47]: bytes([ord(chr(256))])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-49-5555e18dbece> in <module>
----> 1 bytes([ord(chr(256))])

ValueError: bytes must be in range(0, 256)
[47]中的
:字节([ord(chr(256)))
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
---->1字节([ord(chr(256))]))
ValueError:字节必须在范围(0,256)内

要转换字符串,只需使用在字节和字符之间具有1:1映射的“latin1”将其编码为字节,然后使用“utf8”解码即可:

s = "\xd0\xa0\xd0\xb0\xd1\x81\xd1\x88\xd0\xb8\xd1\x84\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba\xd0\xb0_RootKit.com_63k.txt"

s.encode('latin1').decode('utf8')

# 'Расшифровка_RootKit.com_63k.txt'

正确的。有没有办法不用解码就把字符串转换成字节?(我知道这没有多大意义)就像你说的“这没有多大意义”。我还在努力理解你想做什么?您的输入是什么?您想要的输出是什么?我正在谈论的文件被上传到flask api,但是它的名称变成了我的变量
path
,flask无法保存该文件,所以我尝试重命名它。这非常棒,非常优雅!谢谢。@Chocorean用解释和关于无效字符串的注释更新了答案,顺便说一句,我认为用
latin1
的答案是这个问题的真实答案,我现在明白了。非常感谢。