【问题标题】:Read multiple bytes in Hexadecimal file using python使用python读取十六进制文件中的多个字节
【发布时间】:2014-05-06 21:33:39
【问题描述】:

我有一个十六进制文件,如下所示:-

00000000 AA AA 11 FF EC FF E7 3E FA DA D8 78 39 75 89 4E
00000010 FD FD BF E5 FF DD FF AA E9 78 67 84 90 E4 87 83
00000020 9F E7 80 FD FE 73 75 78 93 47 58 93 EE 33 33 3F

我想读取第 3 和第 4 个字节。交换这两个字节并将它们保存在一个变量中。例如,我想在变量“num”中保存 0xFF11(字节交换后)

这是我尝试过的: 我一一读取这两个字节

data=open('xyz.bin','rb').read()
num1=data[2]
num2=data[3]
num1,num2=num2,num1
num= num1*100+num2
print(num)

现在的问题是 num 变量具有整数值,我不知道如何将十六进制放入其中。 我被困在这里,无法继续前进。欢迎任何帮助。

PS:我对python很陌生。

【问题讨论】:

标签: python parsing hex bytearray byte-shifting


【解决方案1】:
import struct

with open("xyz.bin", "rb") as f:
    f.seek(2)
    num, = struct.unpack("<H", f.read(2))
    print "little endian:", hex(num), num  # little endian: 0xff11 65297

【讨论】:

    【解决方案2】:

    在 Python 3 中,您可以直接从字节创建整数:

    with open('xyz.bin','rb') as file:
        file.seek(2)
        num = int.from_bytes(file.read(2), 'little')
        print(hex(num), num) # -> 0xff11 65297
    

    【讨论】:

      【解决方案3】:

      首先,您必须将num1 乘以256,当然,不是100(不过,您可以将十进制256 写成0x100,如果这有助于使您的意图更清晰)。

      其次,要将整数格式化为十六进制数,请使用

      print("{:x}".format(num))
      

      例如:

      >>> num1 = 0xff
      >>> num2 = 0xab
      >>> num = num1*256 + num2
      >>> print("{:x}".format(num))
      ffab
      

      【讨论】:

        【解决方案4】:

        您可能对以下部分/全部操作感兴趣,这些操作抽象出您必须执行的所有按位数学运算。

        import struct
        
        line = '00000000 AA AA 11 FF EC FF E7 3E FA DA D8 78 39 75 89 4E'.split()
        
        bytearray(int(x,16) for x in line[3:5])
        Out[42]: bytearray(b'\x11\xff')
        
        struct.unpack('H',bytearray(int(x,16) for x in line[3:5]))
        Out[43]: (65297,) 
        
        hex(65297)
        Out[44]: '0xff11'
        
        packed_line = bytearray(int(x,16) for x in line[1:])
        
        struct.unpack('{}H'.format(len(packed_line)/2),packed_line)
        Out[47]: (43690, 65297, 65516, 16103, 56058, 30936, 30009, 20105)
        

        【讨论】:

          【解决方案5】:

          最好的方法是使用 struct module.

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-17
            • 2015-05-15
            • 1970-01-01
            • 2022-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-04
            相关资源
            最近更新 更多