Python 字节串比特串转换以及大小端相关的几个方法
大端 小端 介紹
查看當(dāng)前系統(tǒng)是大端還是小端:sys.byteorder,Windows是小端的,而小端在我們看來是和常規(guī)反向地
關(guān)于大小端的知識,推薦幾篇文章:
CPU架構(gòu)決定大小端模式
理解大端與小端字節(jié)序
字符編碼方式及大端小端
大端小端取決于CPU架構(gòu),powerpc,aix、SPARC等是大端;x86架構(gòu)處理器(Intel、AMD,PC)、arm架構(gòu)處理器(arm,手機(jī))是小端
大端存儲模式是指字或半字的最高字節(jié)(Most Significant
Bit,MSB)存放在內(nèi)存的最低位字節(jié)地址上,而字?jǐn)?shù)據(jù)的低字節(jié)則存放在高地址中。 (1) 數(shù)據(jù)在寄存器中都是以大端模式次序存放的。
(2) 對于內(nèi)存中以小端模式存放的數(shù)據(jù)。CPU存取數(shù)成時,小端和大端之間的轉(zhuǎn)換是通過硬件實現(xiàn)的,沒有數(shù)據(jù)加載/存儲的開銷。
這也是為什么說Windows系統(tǒng)是小端,而Linux可能是大端也可能是小端
相關(guān)模塊
· binascii : str,bytes 字節(jié)串與ascii字符
· hex : str 十進(jìn)制與十六進(jìn)制
· bytes : 類 單位為bytes 字節(jié)串 hex, decode 字節(jié)串與十六進(jìn)制字符串、字符編碼
· int : to_bytes, from_bytes 十進(jìn)制與字節(jié)串,必須指定大小端
· str : encode 字符編碼至字節(jié)串
· bitstring : 第三方類 單位為bit 比特串 .Bits(bytes) .bin .hex .oct 比特串(切片、索引、搜索)與字節(jié)串(輸入)與字符串(各種進(jìn)制輸出),在生成時可以指定大小端,索引的元素值是bool值
pip安裝
使用手冊網(wǎng)頁版
使用手冊pdf版
· struct : 按照內(nèi)置算法轉(zhuǎn)換類型至C類型 類型結(jié)構(gòu)與字節(jié)串
讀取符號位
我就因為需要這個功能才相對字節(jié)串甚至比特串操作的,雖然最后沒用到專門的模塊
最終方法:
bytes的索引會自動返回int,而bin可以直接處理int,去頭后補(bǔ)齊8位讀取第一位
字節(jié)串的賦值表達(dá)式
bytes((1,2,ord('1'),ord('2'))) # 可迭代類型,元素是數(shù)字 Out[226]: b'\x01\x0212'bytes((0xff,)) Out[231]: b'\xff'bytes(3) # 生成3個字節(jié)的字節(jié)串 Out[229]: b'\x00\x00\x00'字節(jié)串大小端互換 bytes[::-1]
字節(jié)自己的次序單位就是1字節(jié)(FF)而非4比特(F),也不是1比特(1),所以字節(jié)串的切片法就是切換大小端的方式,不過因為沒有標(biāo)記描述某字節(jié)串是大端還是小端,所以建議僅最初(加載小端)和最終(寫入或展示小端)的時候才使用大小端互換,一般就用我們習(xí)慣的大端去表示
在整數(shù)與字節(jié)串互轉(zhuǎn)以及struct那里有大小端結(jié)構(gòu)的設(shè)置
struct
他是專門解釋十六進(jìn)制和各種數(shù)據(jù)類型的,但是他只是解釋層,而非真實層,他是以他內(nèi)有的算法而將對應(yīng)的類型轉(zhuǎn)換成十六進(jìn)制,并不是真的從內(nèi)存中讀取真實的存儲結(jié)構(gòu),例如超位整數(shù)。
struct的作用是把指定格式的數(shù)據(jù)打包成二進(jìn)制,解包同理。
@: native order, size & alignment (default)=: native order, std. size & alignment<: little-endian, std. size & alignment>: big-endian, std. size & alignment!: same as >| @ | 按原字節(jié) | 按原字節(jié) | 按原字節(jié) |
| = | 按原字節(jié) | 標(biāo)準(zhǔn) | 無 |
| < | 小端 | 標(biāo)準(zhǔn) | 無 |
| > | 大端 | 標(biāo)準(zhǔn) | 無 |
| ! | 網(wǎng)絡(luò)(= | 大端) | 標(biāo)準(zhǔn) |
| x | 填充字節(jié) | 無 | |
| c | char | 長度為1的字節(jié)串 | 1 |
| b | signedchar | 整數(shù) | 1 |
| B | unsignedchar | 整數(shù) | 1 |
| ? | _Bool | bool | 1 |
| h | short | 整數(shù) | 2 |
| H | unsignedshort | 整數(shù) | 2 |
| i | int | 整數(shù) | 4 |
| I | unsignedint | 整數(shù) | 4 |
| l | ong | 整數(shù) | 4 |
| L | unsignedlong | 整數(shù) | 4 |
| q | longlong | 整數(shù) | 8 |
| Q | unsignedlonglong | 整數(shù) | 8 |
| n | ssize_t | 整數(shù) | |
| N | size_t | 整數(shù) | |
| e | 浮點數(shù) | 2 | |
| f | float | 浮點數(shù)4 | |
| d | double | 浮點數(shù) | 8 |
| s | char[] | 字節(jié)串 | |
| p | char[] | 字節(jié)串 | |
| P | void* | 整數(shù) |
Python3.4.3使用struct模塊的pack、unpack對字節(jié)數(shù)據(jù)的處理(壓包,解包)
struct.pack('9si2s',b'HTTP/1.1 ',200,b'OK')這里要注意字符串需要添加字符個數(shù)的,我就在這里蒙了很久,寫不出來
這里
其他類型與字節(jié)串互轉(zhuǎn)
· 二進(jìn)制 bitstring.Bits(bytes),Bits.hex,Bits.bin,Bits[1:2]
· 字符串 str.encode;bytes.decode
· 整數(shù) int.to_bytes;int.from_bytes,這里有一個btyeorder的參數(shù),可以直接設(shè)置輸出是大端還是小端
int.to_bytes(16,length=2,byteorder='big') Out[78]: b'\x00\x10'· 十六進(jìn)制字符串 bytes.fromhex,binascii.unhexlify(hexstr);bytes.hex
binascii.unhexlify('1ff3') Out[145]: b'\x1f\xf3'binascii.unhexlify(b'1ff3') Out[146]: b'\x1f\xf3'binascii.hexlify(b'1ff3') Out[147]: b'31666633'binascii.hexlify(b'\x1f\xf3') Out[148]: b'1ff3''1ff3'.encode() Out[154]: b'1ff3'這里b’1ff3’雖然是字節(jié)串類型,但是他表示的就是一串a(chǎn)scii字符,這里會自動將他作為一串a(chǎn)scii字符串處理,就是’1ff3’,而在第三行,他又被當(dāng)作字節(jié)串處理,解碼出的又被當(dāng)作字符串處理,有點繞,我只能說這個方法編寫的比較模糊。
字節(jié)碼在表示時有兩種模式,純十六進(jìn)制表示,就是上面unhexlify的結(jié)果。
還有就是嘗試盡可能使用ascii表示,例如HxD,其實這才應(yīng)該是Python的默認(rèn)模式,而binascii的默認(rèn)模式是純hex模式。
‘b17c9385d9783963a8’這是從內(nèi)存中讀取的片段,而他默認(rèn)的bytes顯示是:
b’\xb1|\x93\x85\xd9x9c\xa8’
嗯嗯,原來如此,至少這個功能的意思是把
len(b'b17c9385d9783963a8') Out[191]: 18len(b'\xb1|\x93\x85\xd9x9c\xa8') Out[192]: 9binascii.hexlify(b'b17c9385d9783963a8') Out[194]: b'623137633933383564393738333936336138'b'b17c9385d9783963a8'.hex() Out[196]: '623137633933383564393738333936336138'但是為什么兩個的長度不一樣呢,這里b又被當(dāng)作了一串a(chǎn)scii的表示,b1是’b1’而非0xb1。
又或者我在里面加上\x,他只會把挨著他的后面兩個值當(dāng)作hex而非ascii處理。
那么若想hexlify出b’b17c9385d9783963a8’,還有其他方法嗎?
bytes.fromhex('b17c9385d9783963a8') Out[199]: b'\xb1|\x93\x85\xd9x9c\xa8'binascii.hexlify(b'\xb1|\x93\x85\xd9x9c\xa8') Out[200]: b'b17c9385d9783963a8'而最初的b’\xb1|\x93\x85\xd9x9c\xa8’,是我string_st的內(nèi)存片段。我只能說binascii的結(jié)構(gòu)不夠嚴(yán)謹(jǐn)。
總結(jié)
以上是生活随笔為你收集整理的Python 字节串比特串转换以及大小端相关的几个方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机找不到工具怎么办,电脑工具栏声音图
- 下一篇: 用python实现神经网络