2013-11-23 97 views
0

我有一個非常長的字符串,它是1和0的。它大約有12個32位彙編指令。我想寫這個流到一個.bin文件...但我不希望它是ASCII格式。我只想將1和0寫入文件。任何想法如何轉換並使用.write來完成這個?謝謝!Python將字符串「1001101」作爲二進制流寫入文件

+0

沒有bin文件是ASCII格式。但是,如果在文本編輯器中打開bin文件,肯定會出現一些可讀的字符,因爲編輯器將字節解釋爲ASCII字符。數字32和空格之間基本上沒有區別。這只是你看待它的方式。在你的情況下,「1001101」將顯示爲「M」。 – Hyperboreus

+2

使用[struct](http://docs.python.org/2/library/struct.html) – dawg

回答

3

看來你需要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格式是本機格式unsigned int類型,你可以指定字節順序expicetely,與>I是大端int32和<I little-endian(注意倒序的4字節序列):

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

我正準備回答我自己的問題......但你也是這麼做的。你的問題有一個,它需要轉換成大端。我在輸出上用xxd檢查過它,它工作。感謝你的回答!這是我的代碼工作。 'i = 0 while i Diesel

+0

@ user2304751是的,我沒有提到字節順序,並且即將編輯我的答案,但你評論得更快:)我將添加這個以供進一步參考。 – alko

+2

@alko它是「endian」,而不是「印度人」。與大次大陸的公民沒有任何關係。這個詞源於格列佛的旅行,因爲關於如何去除蛋的問題存在爭議:在大的一端或在小端。因此,「大端」和「小端」。一,二,三,四,五個小端。 – Hyperboreus

1

這是如何在你的二進制字符串寫入文件,假設它是在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是純粹的巧合。它是二元的。