日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python 字节串比特串转换以及大小端相关的几个方法

發(fā)布時間:2023/12/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 字节串比特串转换以及大小端相关的几个方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大端 小端 介紹

查看當(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é)串甚至比特串操作的,雖然最后沒用到專門的模塊
最終方法:

0 if b[0]<=128 else 1 # 84.7 ns b[0]<=128 # 79 ns b='\xff' bin(int(b.hex(),16))[2:].rjust(len(b)*8,'0') # 828 ns bin(b[0])[2:].rjust(8,'0')[0] # 412 ns

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é)
=按原字節(jié)標(biāo)準(zhǔn)
<小端標(biāo)準(zhǔn)
>大端標(biāo)準(zhǔn)
!網(wǎng)絡(luò)(=大端)標(biāo)準(zhǔn)
格式C類型Python類型標(biāo)準(zhǔn)大小
x填充字節(jié)
cchar長度為1的字節(jié)串1
bsignedchar整數(shù)1
Bunsignedchar整數(shù)1
?_Boolbool1
hshort整數(shù)2
Hunsignedshort整數(shù)2
iint整數(shù)4
Iunsignedint整數(shù)4
long整數(shù)4
Lunsignedlong整數(shù)4
qlonglong整數(shù)8
Qunsignedlonglong整數(shù)8
nssize_t整數(shù)
Nsize_t整數(shù)
e浮點數(shù)2
ffloat浮點數(shù)4
ddouble浮點數(shù)8
schar[]字節(jié)串
pchar[]字節(jié)串
Pvoid*整數(shù)
struct.pack('L', 0x1234ab) Out[266]: b'\xab4\x12\x00'struct.pack('>L', 0x1234ab) Out[240]: b'\x00\x124\xab'

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’

>>> binascii.hexlify(b'\xb1|\x93\x85\xd9x9c\xa8') b'b17c9385d9783963a8'

嗯嗯,原來如此,至少這個功能的意思是把

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。