使用Python進行二進位制檔案讀寫

2021-10-02 13:49:56 字數 2762 閱讀 7420

總的感覺,python本身並沒有對二進位制進行支援,不過提供了乙個模組來彌補,就是struct模組。

python沒有二進位制型別,但可以儲存二進位制型別的資料,就是用string字串型別來儲存二進位制資料,這也沒關係,因為string是以1個位元組為單位的。

import struct

a=12.34

#將a變為二進位制

bytes=struct.pack('i',a)

此時bytes就是乙個string字串,字串按位元組同a的二進位制儲存內容相同。

再進行反操作

現有二進位制資料bytes,(其實就是字串),將它反過來轉換成python的資料型別:

a,=struct.unpack('i',bytes)

注意,unpack返回的是tuple

所以如果只有乙個變數的話:

bytes=struct.pack('i',a)

那麼,解碼的時候需要這樣

a,=struct.unpack('i',bytes) 或者 (a,)=struct.unpack('i',bytes)

如果直接用a=struct.unpack('i',bytes),那麼 a=(12.34,) ,是乙個tuple而不是原來的浮點數了。

如果是由多個資料構成的,可以這樣:

a='hello'

b='world!'

c=2d=45.123

bytes=struct.pack('5s6sif',a,b,c,d)

此時的bytes就是二進位制形式的資料了,可以直接寫入檔案比如 binfile.write(bytes)

然後,當我們需要時可以再讀出來,bytes=binfile.read()

再通過struct.unpack()解碼成python變數

a,b,c,d=struct.unpack('5s6sif',bytes)

'5s6sif'這個叫做fmt,就是格式化字串,由數字加字元構成,5s表示佔5個字元的字串,2i,表示2個整數等等,下面是可用的字元及型別,ctype表示可以與python中的型別一一對應。

format

c type

python

位元組數x

pad byte

no value1c

char

string of length 11b

signed char

integer1b

unsigned char

integer1?

_bool

bool1h

short

integer2h

unsigned short

integer2i

intinteger4i

unsigned int

integer or long4l

long

integer4l

unsigned long

long4q

long long

long8q

unsigned long long

long8f

float

float4d

double

float8s

char

string1p

char

string1p

void *

long

最後乙個可以用來表示指標型別的,佔4個位元組

為了同c中的結構體交換資料,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而還提供了

character

byte order

size and alignment

@native

native            湊夠4個位元組

=native

standard        按原位元組數

<

little-endian

standard        按原位元組數

>

big-endian

standard       按原位元組數

!network (= big-endian)

standard       按原位元組數

使用方法是放在fmt的第乙個位置,就像'@5s6sif'

-----二進位制檔案處理時會碰到的問題-----

我們使用處理二進位制檔案時,需要用如下方法

binfile=open(filepath,'rb')    讀二進位制檔案

或binfile=open(filepath,'wb')    寫二進位制檔案

那麼和binfile=open(filepath,'r')的結果到底有何不同呢?

不同之處有兩個地方:

第一,使用'r'的時候如果碰到'0x1a',就會視為檔案結束,這就是eof。使用'rb'則不存在這個問題。即,如果你用二進位制寫入再用文字讀出的話,如果其中存在'0x1a',就只會讀出檔案的一部分。使用'rb'的時候會一直讀到檔案末尾。

第二,對於字串x='abc/ndef',我們可用len(x)得到它的長度為7,/n我們稱之為換行符,實際上是 '0x0a'。當我們用'w' 即文字方式寫的時候,在windows平台上會自動將'0x0a'變成兩個字元'0x0d','0x0a',即檔案長度實際上變成8.。當用'r'文字方式讀取時,又自動的轉換成原來的換行符。如果換成'wb'二進位制方式來寫的話,則會保持乙個字元不變,讀取時也是原樣讀取。所以如果用文字方式寫入,用二進位制方式讀取的話,就要考慮這多出的乙個位元組了。'0x0d'又稱回車符。

linux下不會變。因為linux只使用'0x0a'來表示換行。

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制運算使用

問題 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。分析 1 二進位制異或將得到他們的非進製部分。2 二進位制相與並左移一位,等效於進製。3 重複上述步驟 知道進製為0.code public int add int num1,int num2 return num1 參考 ww...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...