本文目錄一覽:
python str與bytes編碼解碼
下面一張圖搞懂編碼、解碼、編碼表之間的關係。
不難看出,它們是一種根據編碼表進行翻譯、映射的過程:
實際上,字符串類型只有encode()方法,沒有decode()方法,而bytes類型只有decode()方法而沒有encode()方法。
二進制格式的數據也常稱為裸數據(raw data),所以str數據經過編碼後得到raw data,raw data解碼後得到的str。
上面說了,編碼是將字符數據轉換成字節數據(raw data),解碼是將字節數據轉換成字符數據。在Python中字符數據也就是字符串,即str類型,字節數據也就是bytes類型或bytearray類型。
編碼時,可以使用字節類型的構造方法bytes()、bytearray()來構造字節,也可以使用str類型的encode()方法來轉換。
解碼時,可以使用str類型的構造方法str()來構造字符串,也可以使用bytes、bytearray()類型的decode()方法。
另外需要注意的是,編碼和解碼的過程中都需要指定編碼表(字符集),默認採用的是utf-8字符集。
例如,使用encode()的方式將str編碼為bytes數據。
使用bytes()和bytearray()將str構造成bytes或bytearray數據,這兩個方法都要求str-byte的過程中給定編碼。
實際上,bytes()、bytearray()這兩個方法構造字節數據的時候還有點複雜,因為可以從多個數據源來構造,比如字符串、整數值、buffer。如何使用這兩個方法構造字節數據,詳細內容參考help(bytes)和help(bytearray)給出的說明,這裡給幾個簡單示例。
構造bytes的方式:
構造bytearray的方式:
解碼是字節序列到str類型的轉換。
例如,使用decode()方法進行解碼”我”字,它的utf-8的編碼對應為”\xe6\x88\x91″:
使用str()進行轉換。
當編碼、解碼的過程使用了不同的(不兼容的)編碼表時,就會出現亂碼。所以,解決亂碼的唯一方式是指定對應的編碼表進行編碼、解碼。
例如,使用utf-8編碼”我”字,得到一個bytes序列,然後使用gbk解碼這個bytes序列。
這裡報錯了,因為utf-8的字節序列里有gbk無法解碼的字節。如果使用文本編輯器一樣的工具去顯化這個過程,得到的將是亂碼字符。
原文地址:
ASN.1語法以及在python中如何編碼解碼
“
ASN.1的文章本來是免費的,但是有的人一定要搞小動作,咱惹不起就只能躲着了,做了一些修改後,改為付費文章
”
應用程序在網絡協議的應用層對payload數據,多使用ASN.1標準進行處理
ASN.1
ASN.1
“
Abstract Syntax Notation One,抽象語法標記,ASN.1是描述數據格式的標準方法, 它不管語言是如何執行、這些數據具體指什麼、用什麼類型的編碼規則 ,是一種抽象的語法
”
ASN.1由兩部分組成:
一部分描述信息內數據,數據類型及序列格式
另一部分描述如何將各部分組成消息
語法
例如
Report ::= SEQUENCE {
author OCTET STRING,
title OCTET STRING,
body OCTET STRING,
biblio Bibliography
}
Report是結構體名稱
SEQUENCE表示消息是由許多數據單元構成的
中括號{}裡面是各種類型的數據單元
前三個數據單元author/title/body的類型是OCTET STRING
最後一個數據單元biblio的類型是另一個ASN.1結構體
Bibliography ::= SEQUENCE {
author OCTET STRING
title OCTET STRING
publisher OCTET STRING
year OCTET STRING
}
數據類型
類型含義
NULL空
BOOLEAN布爾類型
INTEGER整型
REAL實數類型
BIT STRING比特串
OCTEC STRING字節串
OBJECT IDENTIFIER實體標識符
ENUMERATED枚舉類型
SEQUENCE序列
SEQUENCE OF類型的序列
SET集合
SET OF類型的集合
CHOICECHOICE類型
…STRING(有很多就不一一列舉)字符串類型
UTCTime時間類型
GeneralizedTime時間類型
ASN.1文件結構
例如
Foo DEFINITIONS ::= BEGIN
Question ::= SEQUENCE {
id INTEGER,
question IA5String
}
Answer ::= SEQUENCE {
id INTEGER,
answer BOOLEAN
}
END
解析上面的ASN.1文件的結構
ASN.1支持的編碼規則
基本編碼規則(BER)
規範編碼規則(CER)
識別名編碼規則(DER)
壓縮編碼規則(PER)
XML編碼規則(XER)
python如何對ASN.1結構的信息編碼和解碼
如果我們想用python對信息進行編碼,需要明確幾點:
提供的ASN.1格式的數據
更多內容,請參考公-中-號, 汽車網絡診斷通信
python編程(三級)1、編碼、數制
在計算機中使用的是二進制,(為什麼呢,因為二進制計算簡單,可以用電路表示等等很多優點)。但是二進制對閱讀和使用是不友好的,因此需要將二進制轉換為人類使用的語言,英語,中文等,這就是編碼。
最初的編碼就是ASCII編碼,美國信息交換碼。它使用一個字節,8位二進制,可以表示128個符號。常用的1-9,26個字母以及一些英語符號等。
ascii表是不能表示中文的,因此中文也有專門的編碼,諸如GB2312,GBK等。其它國家也有類似編碼,因此為了方便信息的交流,也就有了統一編碼,Unicode,又叫萬國碼。unicode用0-65535來表示所有字符,Unicode用2-4個字節存儲。不同的存儲方式,又不同的編碼,這就是UTF-8,UTF-16,UTF-32。utf-8根據字符數字的大小,來決定存儲字節,存儲英文字符時用1個字節,存儲漢字時用2個字節。utf-16,兩個字節,utf-32,四個字節。
python3 在內存中使用的是Unicode,萬國碼,默認的編碼是utf-8。
chr() ,轉換為對應Unicode表字符
ord(),轉換為對於Unicode表數字
encode(),編碼,將str轉換為字節流
decode(),解碼,將字節流轉換為str
計算機存儲數據的格式是二進制,日常和數學中使用的數字是十進制,為了表達簡化,因此有了十六進制、八進制。
二進制—-十進制—-八進制—》十六進制
10000001 —》129 —》201—》81
從上式可以看出來,進制越大,表達更大數時更簡化。
二進制轉十進制 ,按權展開相加
十進制轉二進制,除基取余
二進制轉八進制 ,從右往左,取3位轉換為十進制得到即為8進制,不足3位左邊補0。
八進制轉二進制,每位展開得到3個二進制位
二進制轉十六進制,,從右往左,取4位轉換為十進制得到即為16進制,不足3位左邊補0。
十六進制轉二進制,每位展開得到四個二進制位
int() ,
hex(),轉換為16進制
bin(),轉換為二進制
oct(),轉換為八進制
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/151240.html