日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python二進(jìn)制文件的轉(zhuǎn)譯詳解

系統(tǒng) 1757 0

首先導(dǎo)入所需的包:import struct

struct有以下幾個(gè)主要的函數(shù):

            
# 按照給定的格式(fmt),把數(shù)據(jù)封裝成字符串(實(shí)際上是類似于c結(jié)構(gòu)體的字節(jié)流)
pack(fmt, v1, v2, ...)
# 按照給定的格式(fmt)解析字節(jié)流string,返回解析出來的tuple
unpack(fmt, string) 
# 計(jì)算給定的格式(fmt)占用多少字節(jié)的內(nèi)存
calcsize(fmt)
          

例如:我需要讀取一個(gè)名為filename,存放著形狀為[100,1025]的浮點(diǎn)數(shù)的文件。可以采用以下辦法

            
import numpy as np
import struct 
# 加載測試數(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,則以上語句改為 data = struct.unpack('>'+str(d_len/4)+'f',d_str)
data = struct.unpack(d_len2*'d',d_str)
          

注意:fmt前的數(shù)字必須為int型,即int*'d' 否則會報(bào)‘can't multiply sequence by non-int of type 'float'' 的錯誤

具體函數(shù)細(xì)節(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中的結(jié)構(gòu)體交換數(shù)據(jù),還要考慮有的c或c++編譯器使用了字節(jié)對齊,通常是以4個(gè)字節(jié)為單位的32位系統(tǒng),故而struct根據(jù)本地機(jī)器字節(jié)順序轉(zhuǎn)換.可以用格式中的第一個(gè)字符來改變對齊方式.定義如下:

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é)序通常稱之為網(wǎng)絡(luò)字節(jié)序。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 两当县| 琼结县| 富顺县| 建德市| 永德县| 玉龙| 孟村| 布尔津县| 临夏市| 兴海县| 乐安县| 襄汾县| 久治县| 明溪县| 错那县| 乌兰察布市| 夏津县| 陇川县| 东宁县| 九龙坡区| 巫溪县| 綦江县| 马山县| 洛川县| 久治县| 萨嘎县| 尼玛县| 桑日县| 德阳市| 内江市| 红安县| 武穴市| 辽宁省| 辛集市| 兰州市| 镇巴县| 苍南县| 马边| 广州市| 南昌市| 治多县|