python二進(jìn)制文件的轉(zhuǎn)譯詳解
首先導(dǎo)入所需的包:import struct
struct有以下幾個(gè)主要的函數(shù):
# 按照給定的格式(fmt),把數(shù)據(jù)封裝成字符串(實(shí)際上是類(lèi)似于c結(jié)構(gòu)體的字節(jié)流) pack(fmt, v1, v2, ...) # 按照給定的格式(fmt)解析字節(jié)流string,返回解析出來(lái)的tuple unpack(fmt, string) # 計(jì)算給定的格式(fmt)占用多少字節(jié)的內(nèi)存 calcsize(fmt)
例如:我需要讀取一個(gè)名為filename,存放著形狀為[100,1025]的浮點(diǎn)數(shù)的文件??梢圆捎靡韵罗k法
import numpy as np
import struct
# 加載測(cè)試數(shù)據(jù)
f = open('filename','rb')
# 102500為文檔中包含的數(shù)字個(gè)數(shù),而一個(gè)浮點(diǎn)數(shù)占4個(gè)字節(jié)
data_raw = struct.unpack('f'*102500,f.read(4*102500))
f.close()
verify_data = np.asarray(verify_data_raw).reshape(-1,1025)
同理如果想轉(zhuǎn)把二進(jìn)制轉(zhuǎn)成double型:
import numpy as np
import struct
f = open('data8.dat','rb')
d_str = f.read()
f.close()
d_len = len(d_str)
d_len2 = d_len//8
#有時(shí)還需考慮字節(jié)順序,如為big-endian,則以上語(yǔ)句改為 data = struct.unpack('>'+str(d_len/4)+'f',d_str)
data = struct.unpack(d_len2*'d',d_str)
注意:fmt前的數(shù)字必須為int型,即int*'d' 否則會(huì)報(bào)‘can't multiply sequence by non-int of type 'float'' 的錯(cuò)誤
具體函數(shù)細(xì)節(jié)請(qǐng)查詢(xún) struct官方文檔
下面提供了了fmt表示方法
| FORMAT | PYTHON TYPE | STANDARD SIZE |
| x | no value | |
| c | string of length 1 | 1 |
| b | integer | 1 |
| B | integer | 1 |
| ? | bool | 1 |
| h | integer | 2 |
| H | integer | 2 |
| i | integer | 4 |
| I | integer | 4 |
| l | integer | 4 |
| L | integer | 4 |
| q | integer | 8 |
| Q | integer | 8 |
| f | float | 4 |
| d | float | 8 |
| s | string | |
| p | string | |
| P | integer |
為了同c中的結(jié)構(gòu)體交換數(shù)據(jù),還要考慮有的c或c++編譯器使用了字節(jié)對(duì)齊,通常是以4個(gè)字節(jié)為單位的32位系統(tǒng),故而struct根據(jù)本地機(jī)器字節(jié)順序轉(zhuǎn)換.可以用格式中的第一個(gè)字符來(lái)改變對(duì)齊方式.定義如下:
| CHARACTER | BYTE ORDER | SIZE | ALIGNMENT |
| @ | native | native | native |
| = | native | standard | none |
| < | little-endian | standard | none |
| > | big-endian | standard | none |
| ! | network (= big-endian) | standard | none |
< : Little-Endian就是低位字節(jié)排放在內(nèi)存的低地址端(棧頂),高位字節(jié)排放在內(nèi)存的高地址端(棧底)
>:Big-Endian就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。
!: 網(wǎng)絡(luò)字節(jié)序:TCP/IP各層協(xié)議將字節(jié)序定義為Big-Endian,因此TCP/IP協(xié)議中使用的字節(jié)序通常稱(chēng)之為網(wǎng)絡(luò)字節(jié)序。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python編寫(xiě)判斷真實(shí)文件類(lèi)型工具
常在河邊走,哪能不濕鞋,網(wǎng)上獲取的各種文件后綴真真假假,甚至一不小心就會(huì)中招,所以本文就來(lái)用Python編寫(xiě)一個(gè)判斷真實(shí)文件類(lèi)型工具吧2025-01-01
Python繪制計(jì)算機(jī)CPU占有率變化的折線(xiàn)圖
這篇文章主要為大家詳細(xì)介紹了Python繪制計(jì)算機(jī)CPU占有率變化的折線(xiàn)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
python opencv檢測(cè)目標(biāo)顏色的實(shí)例講解
下面小編就為大家分享一篇python opencv檢測(cè)目標(biāo)顏色的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
python標(biāo)準(zhǔn)庫(kù)之time模塊的語(yǔ)法與簡(jiǎn)單使用
在平常的代碼中,我們常常需要與時(shí)間打交道,那么在Python中,與時(shí)間處理有關(guān)的模塊就包括:time、datetime以及calendar,這篇文章主要給大家介紹了關(guān)于python標(biāo)準(zhǔn)庫(kù)之time模塊的語(yǔ)法與使用的相關(guān)資料,需要的朋友可以參考下2021-08-08
python opencv實(shí)現(xiàn)圖片旋轉(zhuǎn)矩形分割
這篇文章主要為大家詳細(xì)介紹了python opencv實(shí)現(xiàn)圖片旋轉(zhuǎn)矩形分割,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Flask SocketIO實(shí)現(xiàn)動(dòng)態(tài)繪圖的示例詳解
Flask-SocketIO 是基于 Flask 的一個(gè)擴(kuò)展,用于簡(jiǎn)化在 Flask 應(yīng)用中集成 WebSocket 功能,本文主要介紹了Flask SocketIO如何實(shí)現(xiàn)動(dòng)態(tài)繪圖,需要的可以參考下2023-11-11
使用Python和jieba庫(kù)生成中文詞云的示例代碼
在文本分析和數(shù)據(jù)可視化的領(lǐng)域中,詞云是一種展示文本數(shù)據(jù)中關(guān)鍵詞頻率的直觀方式,Python作為一種強(qiáng)大的編程語(yǔ)言,提供了多種庫(kù)來(lái)幫助我們生成詞云,在本文中,我們將通過(guò)一個(gè)簡(jiǎn)單的示例,展示如何使用Python生成中文詞云,需要的朋友可以參考下2024-07-07

