2013-09-23 85 views
1

我最近重新回到了編程中,並決定將其作爲一個項目讓我走向和激勵我將編寫一個字符編輯器,用於後果2.我遇到的問題是在前幾個字符串之後,我似乎無法使用文件偏移量或結構來提取我需要的數據。Python - 用偏移量和結構讀取二進制文件

這就是我正在做的。 我一起工作的文件是www.retro-gaming-world.com/SAVE.DAT

import struct 
savefile = open('SAVE.DAT', 'rb') 
try: 
     test = savefile.read() 
finally: 
     savefile.close() 

print 'Header: ' + test[0x00:0x18] # returns the save files header description "'FALLOUT SAVE FILE '" 
print "Character Name: " + test[0x1D:0x20+4] Returns the characters name "f1nk" 
print "Save game name: " + test[0x3D:0x1E+4] # isn't returning the save name "church" like expected 
print "Experience: " + str(struct.unpack('>h', test[0x08:0x04])[0]) # is expected to return the current experience but gives the follosing error 

輸出:

Header: FALLOUT SAVE FILE 
Character Name: f1nk 
Save game name: 
    Traceback (most recent call last): 
     File "test", line 11, in <module> 
     print "Experience: " + str(struct.unpack('>h', test[0x08:0x04])[0]) 
    struct.error: unpack requires a string argument of length 2 

我已經證實了偏移,但它只是沒有返回如預期的那樣。

回答

0

test[0x08:0x04]是一個空字符串,因爲結束索引小於起始索引。

例如,test[0x08:0x0A]會爲您提供h代碼所需的兩個字節。

字符串分割的語法是s[start:end]s[start:end:step]Link to docs

+0

我的理解方式是測試[offset:bytestoread],我對它的測試生鏽[offsetstart:offsetend]? – user2806298

+0

感謝你指出了我搞砸了我的切片。測試[0x08:0x08 + 20] 謝謝。 – user2806298

+0

@ user2806298請記住,「結束」索引不是結果的一部分,所以s [8:12]包括s [8],s [9],s [10],s [11],但不是s [12]。另一種想法是s [start:start + length],對於step是1的常見情況。 –