簡體   English   中英

將二進制文件讀入不同的十六進制“類型”(8位,16位,32位,...)

[英]Reading binary file into different hex “types” (8bit, 16bit, 32bit, …)

我有一個包含二進制數據的文件。 該文件的內容只是一個長行。
示例: 010101000011101010101
原始內容是具有以下數據類型的c ++對象數組:

// Care pseudo code, just for visualisation
int64 var1;
int32 var2[50];
int08 var3;

我想跳過var1var3 ,只將var2的值提取到一些可讀的十進制值中。 我的想法是逐字節讀取文件並將它們轉換為十六進制值。 在下一步中,我可以“組合”(追加)這些十六進制值中的4個以獲得一個int32值。
示例: 0x10 0xAA 0x00 0x50 -> 0x10AA0050

我的代碼到目前為止:

def append_hex(a, b):
    return (a << 4) | b

with open("file.dat", "rb") as f:
    counter = 0
    tickdifcounter = 0
    current_byte=" "
    while True:
        if (counter >= 8) and (counter < 208):
            tickdifcounter+=1
            if (tickdifcounter <= 4):
                current_byte = append_hex(current_byte, f.read(1))
                if (not current_byte):
                    break
                val = ord(current_byte)
        if (tickdifcounter > 4):
            print hex(val)
            tickdifcounter = 0
            current_byte=""
        counter+=1
        if(counter == 209):    #209 bytes = int64 + (int32*50) + int08
            counter = 0
    print

現在我append_hex的問題是我的append_hex無效,因為變量是字符串,所以append_hex不起作用。

我是python的新手,所以當我能以更好的方式做某事時,請給我提示。

您可以使用struct module來讀取二進制文件。

這可以幫助您將二進制文件讀取到Python中的結構中

可以使用ord(x)方法將字符轉換為int。 為了獲得多字節數的整數值,將bitshift保留為左。 例如,從早期的項目:

def parseNumber(string, index):
    return ord(string[index])<<24 + ord(string[index+1])<<16 + \
           ord(string[index+2])<<8+ord(string[index+3])

請注意,此代碼假定為big-endian系統,您需要反轉索引以解析little-endian代碼。

如果你知道結構的大小是什么,(或者可以根據文件的大小輕松計算它),你可能更適合使用“ struct ”模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM