今天使用Python來讀取二進(jìn)制文件。直接使用read讀取,讀入的內(nèi)容沒有錯(cuò)誤,長(zhǎng)度也是對(duì)的,使用了type函數(shù)查看了一下內(nèi)存中的數(shù)據(jù)類型,發(fā)現(xiàn)是str的,初步認(rèn)為是采用C語言里面的char方式存儲(chǔ)。
不過我是要把讀入的內(nèi)容轉(zhuǎn)為內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),需要處理整型等數(shù)據(jù)類型。由于自己認(rèn)為是char方式存儲(chǔ)的,就直觀的認(rèn)為只要將4個(gè)字節(jié)的char使用int()函數(shù)強(qiáng)制轉(zhuǎn)換一下就沒有問題的,不過轉(zhuǎn)換失敗。后來咨詢了木頭,說是要使用struct來處理。查手冊(cè),發(fā)現(xiàn)struct狠簡(jiǎn)單,常用的函數(shù)就是pack和unpcak。使用unpack函數(shù)試試,先google一下,網(wǎng)上面有沒有相關(guān)的例子代碼,發(fā)現(xiàn)一個(gè):
print struct.unpack(‘>I‘,recv_data[recv_len-6:recv_len-2])[0]
然后就照貓畫虎寫了一個(gè)
("%s")%struct.unpack(">I", buff[462:466])
不過測(cè)試結(jié)果卻出乎我的意料,讀出來的數(shù)據(jù)不對(duì)。同時(shí)對(duì)>號(hào)感到奇怪,查手冊(cè)struct的下半部分,發(fā)現(xiàn)>是表示網(wǎng)絡(luò)字節(jié)序方式,而不是我們x86系列的本地字節(jié)序,刪除>試試,讀出來的結(jié)果正確。
以前只是在寫網(wǎng)絡(luò)程序的時(shí)候要注意網(wǎng)絡(luò)字節(jié)序問題,現(xiàn)在突然發(fā)現(xiàn),python里面也要考慮字節(jié)序,看來python的處理考慮的還是狠周到的。不過以后也要注意二進(jìn)制的字節(jié)序問題了,畢竟網(wǎng)絡(luò)過來的二進(jìn)制數(shù)據(jù)會(huì)越來越多的,很多程序中應(yīng)該考慮這個(gè)問題。




