【问题标题】:Python write string "1001101" as binary stream to filePython将字符串“1001101”作为二进制流写入文件
【发布时间】:2013-12-08 13:34:21
【问题描述】:

我有一个很长的字符串,分别是 1 和 0。它大约是 12 个 32 位汇编指令。我想将此流写入 .bin 文件...但我不希望它采用 ASCII 格式。我只想将 1 和 0 写入文件。知道如何转换它并使用 .write 来完成这个吗?谢谢!

【问题讨论】:

  • 没有 ASCII 格式的 bin 文件。但是如果你在文本编辑器中打开你的 bin 文件,肯定会出现一些可读的字符,因为编辑器将字节解释为 ASCII 字符。数字 32 和空格之间基本上没有区别。这就是你看待它的方式。在您的情况下,“1001101”将显示为“M”。
  • 使用struct

标签: python string file binary output


【解决方案1】:

看来你需要struct:

import struct
import numpy as np # for random string of ones and zeros

def chunks(s):
    for i in xrange(0, len(s), 32):
         yield s[i:i+32]

s =  ''.join(str(np.random.randint(2)) for x in xrange(32*2))
ints = (int(x, 2) for x in chunks(s)) # convert string from binary repr to integers
bins = (struct.pack('I', i) for i in ints) # pack to unsigned ints

输出:

>>> s
'0000000000011111011101011001010111000000010110111100111110001001'
>>> ''.join(bins)
'\x95u\x1f\x00\x89\xcf[\xc0'

注意I格式是native格式的unsigned int,你可以明确指定字节顺序,>I是big-endian int32,<Ilittle-endian(注意4字节序列的倒序) :

>>> bi_bins = (struct.pack('>I',  i) for i in ints)
>>> ''.join(bi_bins)
'\x00\x1fu\x95\xc0[\xcf\x89'

【讨论】:

  • 我正要回答我自己的问题......但你也做了。你的有一个问题,它需要转换为大端。我在输出上用 xxd 检查了它,它可以工作。感谢您的回答!这是我的有效代码。 i = 0 while i < len(binaryStream): valueToWrite = int(binaryStream[i:i+32],2) binaryFile.write(struct.pack('>I', valueToWrite)) i += 32
  • @user2304751 是的,我没有提到字节顺序,并且正要编辑我的答案,但你评论得更快:) 我会添加这个以供进一步参考。
  • @alko 这是“endian”,而不是“indian”。与大次大陆的公民无关。这个词源于格列佛的游记,因为关于如何剥鸡蛋存在争议:在大端还是在小端。因此,“大端”和“小端”。一、二、三、四、五个小端序。
【解决方案2】:

这是您可以将二进制字符串写入文件的方法,假设它是 32 位整数并假设它使用系统的本机字节序:

#! /usr/bin/python3.2

import struct

b = '011011100010000001101110010010010010000001100001011101100110111101110100011100100110010101100110011010010110111001100001001000000010000001110011011101010110110101100001011101000111010101101101001000000111001101100001011101000110010101100011011010010110010001100110001000000110010101110010011000010110110101110010011011110010111000101110001011100111001100101110001011100010111000101110'

with open ('out.bin', 'wb') as f:
    while b:
        int32 = int (b [:32], 2)
        b = b [32:]
        f.write (struct.pack ('I', int32) )

关于您的 ASCII 问题

如果您在文本编辑器中打开输出文件out.bincat,则会显示以下内容:

$ cat out.bin
In nova fert animus mutatas dicere formas.......

这是人类可读的文本这一事实很好也很恰当。原始比特流可以解释为 ASCII 纯属巧合。它仍然是二进制的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2015-05-07
    • 2015-07-02
    • 2020-08-28
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多