python的位元組串bytes和字串(以及轉義字元的效果)
阿新 • • 發佈:2020-12-24
事情的起源是出於加深protobuf理解的目的想深入的研究下pb的編碼規則。為此有如下例項:
message Test
{
required int32 num1 = 1;
required fixed32 num2 = 2;
}
對這個結構例項化一個對應num1和num2分別賦值10 和1073741824 。連結中輸出序列化後的16進製表示為和2進製表示如下:
十六進位制表示為:
080a 1500 0000 40
二進位制表示為:
00001000000010100001010100000000000000000000000001000000
出於快速的目的我採用python來實現,程式碼如下:
#!/usr/bin/python # -*- coding: utf-8 -*- import test_pb2 test1=test_pb2.Test() test1.num1=10 test1.num2=1073741824 buf=test1.SerializeToString() print("buf:",buf)
得到的輸出結果如下:
對比如下。兩者看起來應該是相同的,但是有兩個位置卻又不同。很是奇怪。
b'\x08\n\x15\x00\x00\[email protected]'
080a 15 00 00 0040
>>> b"\x0a"
b'\n'
>>> b"\x40"
b'@'
這裡先說結論:兩者確實是一個東西,只不過在python的輸出中把能轉義輸出的字元都轉義輸出了而已。
如上圖 ‘\n’其實是‘\x0a’,‘@’其實是‘\x40’。這些都是可以在ASCII碼錶中查到的,例如‘\x0a’就是十進位制的10,對應ASCII碼錶就是換行'\n'。
(1)對於ASCII字元python輸出的是字元本身;對於非ASCII的字元輸出的是它的字元編碼值(十六進位制形式)而不是字元本身。
(2)對於非ASCII字元是十六進位制表示編碼值。
1、對於ASCII字元python輸出的是字元本身;對於非ASCII的字元輸出的是它的字元編碼值(十六進位制形式)而不是字元本身。如下: >>> 'abcd'.encode() b'abcd' >>> '@'.encode() b'@' >>> '我'.encode() b'\xe6\x88\x91' 2、對於非ASCII字元是十六進位制表示編碼值,例如對於上面的'我'。 (1)其中的'\x'表示後面的數是十六進位制 (2)e、6等分別是一個十六進位制編碼值 >>> s="我我python" >>> >>> s.encode() b'\xe4\xbd\xa0\xe5\xa5\xbdpython'
關於encode的作用
encode()的作用是將str轉換為bytes型別;
decode()的作用是將bytes轉換為str型別;
>>> a='abcd'
>>> type(a)
<class 'str'>
>>>
>>> type(a.encode())
<class 'bytes'>
>>>
>>> type(a.encode().decode())
<class 'str'>