Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将二进制数据转换为';0';s和';1';s_Python_String_Encoding_Binary - Fatal编程技术网

Python 将二进制数据转换为';0';s和';1';s

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

我有一个文件,里面填充了二进制数据,表示一个以大端排序的2字节指令序列

我需要能够将这些指令解码为更有意义的等效指令,但我无法将数据转换为我可以使用的格式

我认为最好是将指令转换为0和1的实际字符串

到目前为止,我写了以下内容:

 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:


  • 每次读取一个字节的大文件可能非常慢。通过每次调用
    f.read
    读取更多字节,您将获得更好的性能。 您可以使用以下命令以1024字节为单位对文件内容进行迭代:

    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:


  • 每次读取一个字节的大文件可能非常慢。通过每次调用
    f.read
    读取更多字节,您将获得更好的性能。 您可以使用以下命令以1024字节为单位对文件内容进行迭代:

    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))