編碼
問題來源
最近要根據(jù)一份國家標(biāo)準(zhǔn)協(xié)議進(jìn)行解碼,但是對(duì)于進(jìn)制,字節(jié),字符,編碼,轉(zhuǎn)碼有比較多的問題。其中我想實(shí)現(xiàn)的主要需求如下:
- 有客戶端與服務(wù)端,進(jìn)行tcp通信,客戶端要發(fā)送一個(gè)請(qǐng)求,tcp中payload請(qǐng)求大概是這樣,有很多個(gè)十六進(jìn)制表示的字節(jié)組成
- 根據(jù)協(xié)議的規(guī)定,從中間取出某幾個(gè)字節(jié)進(jìn)行編碼 ,比如第五個(gè)位置-第六個(gè)位置,2個(gè)字節(jié)的代表 學(xué)生人數(shù),某幾個(gè)字節(jié)代表學(xué)生姓名。協(xié)議指出采用ASCII碼編碼,與漢字采用GBK編碼
字符與字節(jié)
- 字符:數(shù)字,符號(hào),字母
- 字節(jié):8byte位構(gòu)成一個(gè)字節(jié),單個(gè)字節(jié)可以由兩個(gè)十六進(jìn)制數(shù)或者8個(gè)二進(jìn)制進(jìn)行標(biāo)識(shí)。
一個(gè)字節(jié)在十進(jìn)制表示中是0-255,即0000 0000到1111 1111,十六進(jìn)制字符可以表示4個(gè)二進(jìn)制位,所以兩個(gè)十六進(jìn)制字符可以表示8個(gè)二進(jìn)制位
- 在計(jì)算機(jī)中每一個(gè)字符都對(duì)應(yīng)著唯一的數(shù)字編碼,也被稱為字符編碼或者字符集
舉個(gè)例子
如果有客戶端跟服務(wù)端,那么中間傳輸?shù)淖止?jié),可以有不同的編碼方式,比如說字母跟數(shù)字可以采用最常見的ASCII編碼方式,但是如果有中文時(shí),我們還可以對(duì)這個(gè)中文字符采用GBK編碼,只不過在解碼的時(shí)候再通過這種方式解決。
常見的編碼方式
- ASCII:最常見的編碼方式
- UTF-8:變長字節(jié)存儲(chǔ)unicode字符,用于保存文本數(shù)據(jù)的編碼
- UTF-16:使用兩個(gè)字節(jié)表示unicode
- GBK編碼:國家標(biāo)準(zhǔn)編碼,支持簡體中文和繁體中文。
- ISO-8859編碼:使用單字節(jié)表示字符,支持多種語言,包括英語、西班牙語、德語等
在python中進(jìn)行解碼的方式
struct是用來解決bytes和其他二進(jìn)制數(shù)據(jù)類型的轉(zhuǎn)換的模塊,它使得流的操作變得非常簡單,完美解決了Python沒有字節(jié)數(shù)據(jù)類型的尷尬。
注意我們這里說的字節(jié)串可以是這樣的
#其中\(zhòng)x代表的就是
str=b'\x00\x12'
struct.pack
作用:Python數(shù)據(jù)類型 ——> “字節(jié)串”
格式:struct.pack(format, v1, v2, …)
struct.unpack
作用:“字節(jié)串” ——> Python數(shù)據(jù)類型
格式:struct.unpack(format, buffer)
format:格式
- 對(duì)齊方式
- 格式字符
payload=b'\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12'
# 大端,按照協(xié)議規(guī)定的字節(jié)數(shù),進(jìn)行解碼。這部分的四個(gè)字節(jié)進(jìn)行解碼
msg_length = struct.unpack('>i',payload[1:5])[0]
# 大端,按照協(xié)議規(guī)定的字節(jié)數(shù),進(jìn)行解碼。這部分的2個(gè)字節(jié)進(jìn)行解碼
msg_id = struct.unpack('>H', payload[9:11])[0]
大端與小端
為什么會(huì)出現(xiàn)大小端?
因?yàn)橛?jì)算機(jī)內(nèi)部存儲(chǔ)數(shù)據(jù)的方式不同
什么是大小端
大端: 首先明確一點(diǎn)就是他與我們的閱讀習(xí)慣是一致的,在書本上,我們是從左往右來看數(shù)字的,這個(gè)不牽扯到存儲(chǔ)。
例如 0x0102 十六進(jìn)制進(jìn)制數(shù),其實(shí)這就是大端存儲(chǔ)。將01這個(gè)數(shù)據(jù)的高字節(jié)存儲(chǔ)到內(nèi)存的底地址中
小端:
例如 0x0201 十六進(jìn)制進(jìn)制數(shù),其實(shí)這就是小端存儲(chǔ)。將01這個(gè)數(shù)據(jù)的高字節(jié)存儲(chǔ)到底地址中文章來源:http://www.zghlxwxcb.cn/news/detail-501118.html
引用 :https://blog.csdn.net/Robin_Pi/article/details/112233764文章來源地址http://www.zghlxwxcb.cn/news/detail-501118.html
到了這里,關(guān)于【計(jì)算機(jī)網(wǎng)絡(luò)】TCP中payload的解析,在python中的體現(xiàn)?字節(jié)、字符?為啥字節(jié)用十六進(jìn)制表示?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!