python二進制文件的轉譯詳解
首先導入所需的包:import struct
struct有以下幾個主要的函數:
# 按照給定的格式(fmt),把數據封裝成字符串(實際上是類似于c結構體的字節(jié)流) pack(fmt, v1, v2, ...) # 按照給定的格式(fmt)解析字節(jié)流string,返回解析出來的tuple unpack(fmt, string) # 計算給定的格式(fmt)占用多少字節(jié)的內存 calcsize(fmt)
例如:我需要讀取一個名為filename,存放著形狀為[100,1025]的浮點數的文件??梢圆捎靡韵罗k法
import numpy as np
import struct
# 加載測試數據
f = open('filename','rb')
# 102500為文檔中包含的數字個數,而一個浮點數占4個字節(jié)
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
#有時還需考慮字節(jié)順序,如為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'' 的錯誤
具體函數細節(jié)請查詢 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++編譯器使用了字節(jié)對齊,通常是以4個字節(jié)為單位的32位系統(tǒng),故而struct根據本地機器字節(jié)順序轉換.可以用格式中的第一個字符來改變對齊方式.定義如下:
| 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é)排放在內存的低地址端(棧頂),高位字節(jié)排放在內存的高地址端(棧底)
>:Big-Endian就是高位字節(jié)排放在內存的低地址端,低位字節(jié)排放在內存的高地址端。
!: 網絡字節(jié)序:TCP/IP各層協議將字節(jié)序定義為Big-Endian,因此TCP/IP協議中使用的字節(jié)序通常稱之為網絡字節(jié)序。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python數據庫批量插入數據的實現(executemany的使用)
這篇文章主要介紹了python數據庫批量插入數據的實現(executemany的使用),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04

