2012-10-20 103 views
0

我正在使用二進制模式讀取python中的文件(磁盤映像和/ dev/sda和likes)。我正在讀取第一個扇區(512字節),並試圖打印磁盤信息(參考號:Wikipedia Articles)。在python中將二進制字符串解釋爲整數

要解釋的東西像第一絕對扇區的分區中的32位LBA,我做這樣的事情 -

def int32(bytes): 
    return int(bytes[3]<<24|bytes[2]<<16|bytes[1]<<8|bytes[0]) 

def int16(bytes): 
    return int(bytes[1]<<8|bytes[0]) 

print('LBA:',int32(partitionEntry[8:12]))

是否有本地笏在Python做到這一點?

有沒有辦法爲奇數位結構做到這一點:在C類型轉換intVar=(int*)someBasePointer


的回答標記後添加?像CHS一樣。 C(柱面)是來自一個字節的10位8位和來自另一個字節的2位。我目前的做法是

def getCHS(bytes): 
    c=bytes[1]&3<<8|bytes[2] 
    h=bytes[0] 
    s=bytes[1]&63 
    return {'c':c,'s':s,'h':h} 
+1

看看在Python'struct'模塊:http://docs.python.org/library/struct。 html(例如:http://docs.python.org/library/struct.html#examples) –

回答

4

你想要struct.unpack()函數。

import struct 

def int32(some_bytes): 
    return struct.unpack("i", some_bytes)[0] 

def int16(some_bytes): 
    return struct.unpack("h", some_bytes)[0] 

如果你從使用不同的字節序值大於當前系統的系統讀取,您可能需要指定格式字符串的存儲方式爲好。

ih是符號int版本;如果你想簽名,使用IH

+0

謝謝。這工作!我正在研究struct的文檔。有沒有辦法做到這一點奇數位結構?像CHS一樣。 C(柱面)是來自一個字節的10位8位和來自另一個字節的2位。 –

+0

'struct'不支持部分字節,不。你仍然必須自己動手操作。 – Amber

+0

謝謝。這對於直接瞭解我是否有用,而不是想知道我是否在重新發明。 –

3

對於簡單的1,2或4個字節的領域,最好的辦法可能是struct.unpack。嘗試是這樣的:

def int32(bytes): 
    return struct.unpack("i", bytes[:4])[0] 

您可能需要與"<i"">i"作爲格式字符串指定字節序。

但是,更多不尋常的字段寬度需要掩蔽和/或偏移。你的方法運作良好;或者,你可以解開一個無符號類型足夠大的尺寸,但它並沒有節省多少工作:

def getCHS(bytes): 
    h, r = struct.unpack("BH", bytes[:3]) 
    c = r & 0x3F 
    s = r >> 10 
    return {'c':c,'s':s,'h':h} 
+0

請注意,這將返回一個具有一個值的元組,而不是單個值。另外,靜靜地切分輸入字節集不會給你帶來太多的收益,並且*會*掩蓋輸入更多數據的意外錯誤。假設你得到一個4字節的字符串輸入會更好。 – Amber

+0

謝謝。這工作!我正在研究struct的文檔。有沒有辦法做到這一點奇數位結構?像CHS一樣。 C(柱面)是來自一個字節的10位8位和來自另一個字節的2位。 –

+0

@Amber:好點;我主要使用解壓縮多個字段,並忘記了詳細信息。 – eswald

相關問題