1. 程式人生 > 其它 >python的位元組串bytes和字串(以及轉義字元的效果)

python的位元組串bytes和字串(以及轉義字元的效果)

技術標籤:pythonpython

事情的起源是出於加深protobuf理解的目的想深入的研究下pb的編碼規則。為此有如下例項:

message Test
{
    required int32 num1 = 1;
    required fixed32 num2 = 2;
}

對這個結構例項化一個對應num1和num2分別賦值10 和1073741824 。連結中輸出序列化後的16進製表示為和2進製表示如下:

十六進位制表示為:
080a 1500 0000 40
二進位制表示為:
0000‭1000000010100001010100000000000000000000000001000000

出於快速的目的我採用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'>