Python 将二进制数据转换为';0';s和';1';s
我有一个文件,里面填充了二进制数据,表示一个以大端排序的2字节指令序列 我需要能够将这些指令解码为更有意义的等效指令,但我无法将数据转换为我可以使用的格式 我认为最好是将指令转换为0和1的实际字符串 到目前为止,我写了以下内容:Python 将二进制数据转换为';0';s和';1';s,python,string,encoding,binary,Python,String,Encoding,Binary,我有一个文件,里面填充了二进制数据,表示一个以大端排序的2字节指令序列 我需要能够将这些指令解码为更有意义的等效指令,但我无法将数据转换为我可以使用的格式 我认为最好是将指令转换为0和1的实际字符串 到目前为止,我写了以下内容: def slurpInstructions(filename): instructions = [] with open(filename, 'rb') as f: while True: try: chunk = f.re
def slurpInstructions(filename):
instructions = []
with open(filename, 'rb') as f:
while True:
try:
chunk = f.read(1)
print(struct.unpack('c', chunk))
except:
break
每次打印1个字节,如下所示:
(b'\x00',)
(b'a',)
我知道文件中的第一条指令是:
0000000001100001
所以,它看起来像是在打印每个字节的整数值对应的ascii字符,除了当int值没有ascii字符时,它只是打印十六进制表示
但我该从这里走到哪里?我需要将我的
b'a'
转换为'1100001'
,因为我实际上关心的是位,而不是字节。您可以将b'a'
转换为相应的整数值,然后使用以下命令以二进制格式打印int:
- 每次读取一个字节的大文件可能非常慢。通过每次调用
读取更多字节,您将获得更好的性能。 您可以使用以下命令以1024字节为单位对文件内容进行迭代:f.read
with open(filename, 'rb') as f: for chunk in iter(lambda: f.read(1024), b''):
- 类似地,为每个字节调用一次
,速度可能非常慢。通过每次调用print
打印更多字节,您将获得更好的性能。因此,您可以使用列表理解来循环print
块中的字节,将每个字节转换为其字符串二进制格式,然后使用
将字符串连接在一起:''。join
print(''.join(['{:b}'.format(ord(c)) for c in chunk]), end='')
- 除了is之外,请使用裸
。如果您选择在此处使用
,请仅列出您希望处理的异常:try..except
try: ... except IOError:
您可以将
b'a'
转换为相应的整数值,然后使用以下命令以二进制格式打印int:
- 每次读取一个字节的大文件可能非常慢。通过每次调用
读取更多字节,您将获得更好的性能。 您可以使用以下命令以1024字节为单位对文件内容进行迭代:f.read
with open(filename, 'rb') as f: for chunk in iter(lambda: f.read(1024), b''):
- 类似地,为每个字节调用一次
,速度可能非常慢。通过每次调用print
打印更多字节,您将获得更好的性能。因此,您可以使用列表理解来循环print
块中的字节,将每个字节转换为其字符串二进制格式,然后使用
将字符串连接在一起:''。join
print(''.join(['{:b}'.format(ord(c)) for c in chunk]), end='')
- 除了is之外,请使用裸
。如果您选择在此处使用
,请仅列出您希望处理的异常:try..except
try: ... except IOError:
在Python 3中,要将2个字节转换为位字符串(): 有关与Python 2/3兼容的单源版本,请参阅 要同时加载所有指令,可以使用:
有关高效读取二进制文件的其他方法,请参阅Python 3中的。将2个字节转换为位字符串(): 有关与Python 2/3兼容的单源版本,请参阅 要同时加载所有指令,可以使用:
有关高效读取二进制文件的其他方法,请参阅。您的裸
try/except
不被视为良好做法。它可以捕获读取时的IO错误,或者struct.unpack上的struct.error
,或者(可能)文件的结尾。令人困惑且不是好的做法。你赤裸裸的try/except
不被认为是好做法。它可以捕获读取时的IO错误,或者struct.unpack上的struct.error
,或者(可能)文件的结尾。混乱且不是很好的实践。比OP的函数好得多的Python<代码>''.join(map('{:08b}.format,chunk))可以用来代替列表理解。Python(比OP的函数)好得多<代码>''.join(映射('{:08b}.format,chunk))可以用来代替列表理解。
#!/usr/bin/env python
import os
import sys
from array import array
instructions = array('H') # each instruction is >=2 bytes
n = os.path.getsize(filename) // instructions.itemsize # number of instructions
with open(filename, 'rb') as file:
instructions.fromfile(file, n) # slurp file
if sys.byteorder == 'little':
instructions.byteswap() # force big-endian order
for h in instructions: # print as bitstrings
print('{:016b}'.format(h))