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類型 類型結構與字節串
讀取符號位
我就因為需要這個功能才相對字節串甚至比特串操作的,雖然最后沒用到專門的模塊
最終方法:
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 >| @ | 按原字節 | 按原字節 | 按原字節 |
| = | 按原字節 | 標準 | 無 |
| < | 小端 | 標準 | 無 |
| > | 大端 | 標準 | 無 |
| ! | 網絡(= | 大端) | 標準 |
| x | 填充字節 | 無 | |
| c | char | 長度為1的字節串 | 1 |
| b | signedchar | 整數 | 1 |
| B | unsignedchar | 整數 | 1 |
| ? | _Bool | bool | 1 |
| h | short | 整數 | 2 |
| H | unsignedshort | 整數 | 2 |
| i | int | 整數 | 4 |
| I | unsignedint | 整數 | 4 |
| l | ong | 整數 | 4 |
| L | unsignedlong | 整數 | 4 |
| q | longlong | 整數 | 8 |
| Q | unsignedlonglong | 整數 | 8 |
| n | ssize_t | 整數 | |
| N | size_t | 整數 | |
| e | 浮點數 | 2 | |
| f | float | 浮點數4 | |
| d | double | 浮點數 | 8 |
| s | char[] | 字節串 | |
| p | char[] | 字節串 | |
| P | void* | 整數 |
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’
嗯嗯,原來如此,至少這個功能的意思是把
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 字节串比特串转换以及大小端相关的几个方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机找不到工具怎么办,电脑工具栏声音图
- 下一篇: linux ubuntu安装教程6,1.