代码之家  ›  专栏  ›  技术社区  ›  Dominic Bou-Samra

在python中操作二进制数据

  •  16
  • Dominic Bou-Samra  · 技术社区  · 15 年前

    我正在打开一个二进制文件,如下所示:

    file = open("test/test.x", 'rb')
    

    把一行字读成一张单子。每行看起来都有点像:

    '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
    

    我很难处理这些数据。如果我尝试打印每一行,python就会冻结,并发出嘟嘟声(我认为在某处有一个二进制嘟嘟声代码)。如何安全地使用这些数据?如何将每个十六进制数转换为十进制数?

    7 回复  |  直到 7 年前
        1
  •  24
  •   ʇsәɹoɈ    9 年前

    要打印它,您可以这样做:

    print repr(data)
    

    对于整个十六进制:

    print data.encode('hex')
    

    对于每个字节的十进制值:

    print ' '.join([str(ord(a)) for a in data])
    

    要从数据中解包二进制整数等,就好像它们最初来自C样式的结构,请查看 struct 模块。

        2
  •  4
  •   Jon-Eric    15 年前

    \xhh is the character with hex value hh . 其他字符,如 . “~”是正常字符。

    对字符串进行迭代可以得到其中的字符,一次一个。

    ord(c) will return an integer representing the character. 例如。, ord('A') == 65 .

    这将打印每个字符的十进制数:

    s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
    print ' '.join(str(ord(c)) for c in s)
    
        3
  •  2
  •   Mattias Nilsson    15 年前

    就像前面提到的,奥德和赫克斯可能会帮助你。 如果要尝试解释文件中的某种结构化二进制数据, struct 模块可能会有所帮助。

        4
  •  2
  •   John Machin Santi    15 年前

    二进制数据很少被分为“行”,用“n”分隔。如果是,它将具有隐式或显式转义机制来区分作为行终止符的'\n'和作为数据的一部分的'\n'。在不了解转义机制的情况下盲目地将这样一个文件读取为行是毫无意义的。

    要回答您的具体问题:

    '\x07'是ascii bel字符,最初用于在电传打字机上响铃。

    您可以通过执行以下操作获得字节“b”的整数值 ord(b) .

    但是,要正确处理二进制数据,需要知道布局是什么。 . 您可以拥有有符号和无符号整数(大小为1、2、4、8字节)、浮点数、变长度的十进制数、固定长度字符串、变长度字符串等。增加的复杂性来自于数据是以bigendian方式还是littleendian方式记录。一旦你了解了以上所有内容(或做出了非常明智的猜测),那么 Python struct module 应该能够用于所有或大部分的处理; ctypes module 也可能有用。

    数据格式是否有名称?如果是,请告诉我们;我们可能会向您指出代码或文档。

    您会问“如何安全地使用这些数据?”这就引出了一个问题:你想用它做什么?你想做什么操作?

        5
  •  1
  •   Yann Ramin    15 年前

    您正在尝试打印转换为ASCII字符的数据,但这不起作用。

    您可以安全地使用数据的任何字节。如果要将其打印为十六进制,请查看函数 ord hex /

        6
  •  1
  •   Paul Richter    15 年前

    你在用吗? read() readline() ?你应该用 read(n) 读取n个字节; RealLoad() 将一直读取,直到它碰到二进制文件可能没有的换行符为止。

    但是,在这两种情况下,都会返回一个字节字符串,该字符串可能是可打印的或不可打印的字符,可能不太有用。

    你想要的是 ord() ,它将一个字节字符串转换为相应的整数值。 读() 从文件中一次一个字节并调用 () 或者遍历整个字符串。

        7
  •  0
  •   Sébastien Boisgérault    7 年前

    如果你愿意用麻木和 bitstream 你可以做到

    >>> from numpy import *
    >>> from bitstream import BitStream
    >>> raw = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
    >>> stream = BitStream(raw)
    >>> stream.read(raw, uint8, len(stream) // 8)
    array([190,   0, 200, 100, 248, 100,   8, 228,  46,   7, 126,   3, 158,
             7, 190,   3, 222,   7, 254,  10], dtype=uint8)