1. 程式人生 > 實用技巧 >Python3編碼解碼與資料型別轉換

Python3編碼解碼與資料型別轉換

目錄

一、bytes物件與字串物件

1.1、bytes物件與字串物件實質

1)、bytes物件

python在進行資料的二進位制傳輸時,其直譯器層面都會使用bytes物件的方式傳輸。無論我們傳輸什麼型別的資料,比如gbk編碼型別,或者utf-8型別,最終都需要轉化為bytes物件傳輸,這一點類似於java的class,底層都是這樣的位元組碼。

2)、bytes存在三種寫法:

  • 單引號: b'同樣允許嵌入 "雙" 引號'。

  • 雙引號: b"同樣允許嵌入 '單' 引號"。

  • 三重引號: b'''三重單引號''', b"""三重雙引號"""

3)、str物件

我們從網上覆制來的資料,貼上在程式碼中,或者從電腦的檔案中讀取的資料都是str物件。可以用type()函式檢視其型別。而str物件傳輸時就需要轉換成bytes物件。

4)、str物件的寫法

  • 單引號: '同樣允許嵌入 "雙" 引號'。

  • 雙引號: "同樣允許嵌入 '單' 引號"。

  • 三重引號: '''三重單引號''', b"""三重雙引號"""

1.2、bytes與str物件轉換

1)、bytes轉str
bytes存在內建函式decode(),我們使用這個函式時僅需控制decode的型別,即是將bytes按什麼樣的方式組織成字串,比如按照utf-8的型別組織,就可以理解為python直譯器獲取010101的資料,轉換成bytes後按照utf-8形式組成字串。
這個是bytes按照utf-8的編碼將\x64\x6f\x67轉換字串

>f = b"\x64\x6f\x67"
>print(f.decode("utf-8"))

>dog

2)、str轉bytes
這個是字串轉換成bytes

>c="dog"
>print(c.encode("utf-8"))

>b'dog'

理解了這個實質,大部分的編碼轉換失敗問題就可以往這兩個相互轉換上理解,就可以解決

二、字串物件的資料型別轉換

2.1、ascii串形式<-->hex字串

ascii串形式就是我們通常意義上理解的字串,也包括回車等不可見字元
hex指的是表現形式為0-f的字串物件

import binascii

def str_to_hexStr(string):
    str_bin = string.encode('utf-8')
    return binascii.b2a_hex(str_bin).decode('utf-8') or binascii.hexlify(str_bin).decode('utf-8')

def str_to_hexStr(string):
    str_bin = string.encode('utf-8')
    return binascii.a2b_hex(str_bin).decode('utf-8') or binascii.unhexlify(str_bin).decode('utf-8')


f = "xxxxxx"
a = str_to_hexStr(f)
print(a)

s = "787878787878"
b = str_to_hexStr(s)
print(b)

>>>787878787878
>>>xxxxxx

一定要注意其中存在的資料物件轉換

2.2、ascii串形式<-->bin字串

def binToStr(binStr):
    return "".join(format(chr(int(binary_value, 2))) for binary_value in binStr.split())

def strToBin(asciiStr):
    return ' '.join(format(ord(x), 'b') for x in asciiStr)

print(binToStr("01100001 01100010 01100011"))
print(strToBin("xxxxxxxxfdsd55"))

>>>abc
>>>1111000 1111000 1111000 1111000 1111000 1111000 1111000 1111000 1100110 1100100 1110011 1100100 110101 110101

2.3、ascii串形式<-->base64字串

import base64

s = "nihao"
res = base64.b64encode(s.encode("utf-8")).decode('utf-8')
print(res)

s1 = "bmloYW8="
res1 = base64.b64decode(s1.encode("utf-8")).decode("utf-8")
print(res1)

>>>bmloYW8=
>>>nihao

2.4、ascii串形式<-->unicode字串

#unicode串轉ascii串,可包括中文
s = "\u006e\u0069\u0068\u0061\u006f"
res = s.encode("unicode_escape").decode("unicode_escape")
print(res)

#中文或ascii轉成unicode串
s1 = "你好"
def strToUnicode(asciiStr):
    return "".join(str(hex(ord((x)))).replace("0x","\\u00") for x in asciiStr)

print(strToUnicode(s1))