我有一个数据文件,打印时会沿着这些行输出一系列字符:
@ AOB @ AZI {@MCcID ... ECT
我也有一个从这个数据文件中提取的二进制值,但我不确定文件中的哪一点。因此,我可以使用
读取数据 with open(self.filename, mode='rb') as data_file:
self._file_contents = data_file.read()
我一直在尝试在表示文件的大字符串中搜索二进制值的索引起始位置。
[m.start() for m in re.finditer(binary, data_file._file_contents]
我尝试使用binary
作为二进制字符串(例如,10011010)并使用str(int(binary,2))
将其转换为可在文件中搜索的整数字符串值。
这些都没有奏效,所以我质疑自己的逻辑和理由。如果您知道如何找到二进制值的索引,如果您100%确定它在文件中,请告诉我您将如何操作。谢谢
答案 0 :(得分:1)
binary = "\x22" # <- this is what binary should look like
[m.start() for m in re.finditer(binary, data_file._file_contents)]
如果你使用binary = chr(77)
如果您有十六进制77=0x4d
,则可以执行binary="\x4d"
如果值大于0xff,则需要unichar binary = unichr(257)
你需要使用unicode字符串(257=0x0101
)binary = u"\u0101"
或binary="\x01\x01"
答案 1 :(得分:0)
更多我想知道是否有更直接的方式以“\ xff \ xff \ xff”格式获取它?
是。这种事情正是struct
模块的用途:
>>> import struct
>>> struct.pack('<I', 4294967295)
'\xff\xff\xff\xff'
>>> struct.pack('<I', 1234567)
'\x87\xd6\x12\x00'
但这里的重要部分是你必须知道你正在寻找什么样的格式。上面的代码将每个数字视为一个小端无符号32位C整数,这是一种非常常见的格式,用于将数字填充到二进制数据中,但肯定不是唯一的。
如果要以十六进制(基数16)或二进制(基数2)而不是十进制来写文字值,当然可以;就Python而言,0b10011
和13
是相同的 - 数字13。所以:
>>> struct.pack('<I', 0b10011)
'\x13\x00\x00\x00'
>>> struct.pack('<I', 0xabcd)
'\xcd\xab\x00\x00'
但是如果你在基数2中有数字的唯一原因是你调用了一个将数字转换为基数2表示的函数,那就不要调用那个函数。