您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何在python中對二進制文件進行轉譯,此處通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下:
Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向對象的腳本語言,其最初的設計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發獨立的項目和大型項目。
首先導入所需的包:import struct
struct有以下幾個主要的函數:
# 按照給定的格式(fmt),把數據封裝成字符串(實際上是類似于c結構體的字節流) pack(fmt, v1, v2, ...) # 按照給定的格式(fmt)解析字節流string,返回解析出來的tuple unpack(fmt, string) # 計算給定的格式(fmt)占用多少字節的內存 calcsize(fmt)
例如:我需要讀取一個名為filename,存放著形狀為[100,1025]的浮點數的文件。可以采用以下辦法
import numpy as np import struct # 加載測試數據 f = open('filename','rb') # 102500為文檔中包含的數字個數,而一個浮點數占4個字節 data_raw = struct.unpack('f'*102500,f.read(4*102500)) f.close() verify_data = np.asarray(verify_data_raw).reshape(-1,1025)
同理如果想轉把二進制轉成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 #有時還需考慮字節順序,如為big-endian,則以上語句改為 data = struct.unpack('>'+str(d_len/4)+'f',d_str) data = struct.unpack(d_len2*'d',d_str)
注意:fmt前的數字必須為int型,即int*'d' 否則會報‘can't multiply sequence by non-int of type 'float'' 的錯誤
具體函數細節請查詢 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中的結構體交換數據,還要考慮有的c或c++編譯器使用了字節對齊,通常是以4個字節為單位的32位系統,故而struct根據本地機器字節順序轉換.可以用格式中的第一個字符來改變對齊方式.定義如下:
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就是低位字節排放在內存的低地址端(棧頂),高位字節排放在內存的高地址端(棧底)
>:Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
到此這篇關于如何在python中對二進制文件進行轉譯的文章就介紹到這了,更多相關如何在python中對二進制文件進行轉譯的內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。