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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

大端 小端 介紹

查看當前系統是大端還是小端:sys.byteorder,Windows是小端的,而小端在我們看來是和常規反向地

關于大小端的知識,推薦幾篇文章:
CPU架構決定大小端模式
理解大端與小端字節序
字符編碼方式及大端小端

大端小端取決于CPU架構,powerpc,aix、SPARC等是大端;x86架構處理器(Intel、AMD,PC)、arm架構處理器(arm,手機)是小端
大端存儲模式是指字或半字的最高字節(Most Significant
Bit,MSB)存放在內存的最低位字節地址上,而字數據的低字節則存放在高地址中。 (1) 數據在寄存器中都是以大端模式次序存放的。
(2) 對于內存中以小端模式存放的數據。CPU存取數成時,小端和大端之間的轉換是通過硬件實現的,沒有數據加載/存儲的開銷。

這也是為什么說Windows系統是小端,而Linux可能是大端也可能是小端

相關模塊

· binascii : str,bytes 字節串與ascii字符
· hex : str 十進制與十六進制
· bytes : 類 單位為bytes 字節串 hex, decode 字節串與十六進制字符串、字符編碼
· int : to_bytes, from_bytes 十進制與字節串,必須指定大小端
· str : encode 字符編碼至字節串
· bitstring : 第三方類 單位為bit 比特串 .Bits(bytes) .bin .hex .oct 比特串(切片、索引、搜索)與字節串(輸入)與字符串(各種進制輸出),在生成時可以指定大小端,索引的元素值是bool值
pip安裝
使用手冊網頁版
使用手冊pdf版
· struct : 按照內置算法轉換類型至C類型 類型結構與字節串

讀取符號位

我就因為需要這個功能才相對字節串甚至比特串操作的,雖然最后沒用到專門的模塊
最終方法:

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,去頭后補齊8位讀取第一位

字節串的賦值表達式

bytes((1,2,ord('1'),ord('2'))) # 可迭代類型,元素是數字 Out[226]: b'\x01\x0212'bytes((0xff,)) Out[231]: b'\xff'bytes(3) # 生成3個字節的字節串 Out[229]: b'\x00\x00\x00'

字節串大小端互換 bytes[::-1]

字節自己的次序單位就是1字節(FF)而非4比特(F),也不是1比特(1),所以字節串的切片法就是切換大小端的方式,不過因為沒有標記描述某字節串是大端還是小端,所以建議僅最初(加載小端)和最終(寫入或展示小端)的時候才使用大小端互換,一般就用我們習慣的大端去表示

在整數與字節串互轉以及struct那里有大小端結構的設置

struct

他是專門解釋十六進制和各種數據類型的,但是他只是解釋層,而非真實層,他是以他內有的算法而將對應的類型轉換成十六進制,并不是真的從內存中讀取真實的存儲結構,例如超位整數。

struct的作用是把指定格式的數據打包成二進制,解包同理。

@: native order, size & alignment (default)=: native order, std. size & alignment<: little-endian, std. size & alignment>: big-endian, std. size & alignment!: same as > 字符字節順序大小對齊方式
@按原字節按原字節按原字節
=按原字節標準
<小端標準
>大端標準
!網絡(=大端)標準
格式C類型Python類型標準大小
x填充字節
cchar長度為1的字節串1
bsignedchar整數1
Bunsignedchar整數1
?_Boolbool1
hshort整數2
Hunsignedshort整數2
iint整數4
Iunsignedint整數4
long整數4
Lunsignedlong整數4
qlonglong整數8
Qunsignedlonglong整數8
nssize_t整數
Nsize_t整數
e浮點數2
ffloat浮點數4
ddouble浮點數8
schar[]字節串
pchar[]字節串
Pvoid*整數
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對字節數據的處理(壓包,解包)

struct.pack('9si2s',b'HTTP/1.1 ',200,b'OK')

這里要注意字符串需要添加字符個數的,我就在這里蒙了很久,寫不出來

這里

其他類型與字節串互轉

· 二進制 bitstring.Bits(bytes),Bits.hex,Bits.bin,Bits[1:2]
· 字符串 str.encode;bytes.decode

· 整數 int.to_bytes;int.from_bytes,這里有一個btyeorder的參數,可以直接設置輸出是大端還是小端

int.to_bytes(16,length=2,byteorder='big') Out[78]: b'\x00\x10'

· 十六進制字符串 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’雖然是字節串類型,但是他表示的就是一串ascii字符,這里會自動將他作為一串ascii字符串處理,就是’1ff3’,而在第三行,他又被當作字節串處理,解碼出的又被當作字符串處理,有點繞,我只能說這個方法編寫的比較模糊。

字節碼在表示時有兩種模式,純十六進制表示,就是上面unhexlify的結果。
還有就是嘗試盡可能使用ascii表示,例如HxD,其實這才應該是Python的默認模式,而binascii的默認模式是純hex模式。

‘b17c9385d9783963a8’這是從內存中讀取的片段,而他默認的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又被當作了一串ascii的表示,b1是’b1’而非0xb1。
又或者我在里面加上\x,他只會把挨著他的后面兩個值當作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的內存片段。我只能說binascii的結構不夠嚴謹。

總結

以上是生活随笔為你收集整理的Python 字节串比特串转换以及大小端相关的几个方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。