将二进制字符串转换为布尔数组并输出二进制文件

时间:2017-01-04 00:48:14

标签: python linux string bash binary

我有一个只有两个ASCII字符的大文本文件(3到6 Gb)。我想将此字符串转换为布尔输出,可以将其写为简单的二进制文件。

拿玩具' test.bin'文件下面是568字节ASCII。有70 * 8,560个字符。每一个' 0'和' 1'是由1个字节编码的字符。我希望将最终输出缩减为560位文件(70字节)文件。

0111000110000000101000100000100100011111010010101000001001010000111000
1001100011010100001101110000100010000010000000000001011000010011111100
0100001000010000010000010111011101011111000111111000111001100010100011
0011101000100001111111000001111110111111101101100000011000010101100001
0000000110110001000000000001000011110100000101101000001000010001010011
1101101111010101011110001110000010011001100101101101000111111101110101
1000001100101101010111110111110101100000000011001000100000000011001110
0101101001110010011110000100101001001111010011100100001001111111100110
...

我发现了另外几种解决方案,将二进制文件转换为ASCII而不是另一种方式,或将incorrectly expanding二进制字符转换为ASCII编码1 - > 0011001,0 - > 0011000.我found a C++ solution,但我正在寻找一个简单的bash或python脚本。

=============================================== ==

基于来自here

的小修正的Bash解决方案
cat test.bin | tr -d '[\n]' | perl -lpe '$_=pack"B*",$_' > true_binary.txt

1 个答案:

答案 0 :(得分:0)

我认为这可能更好地作为评论,但我显然还没有这个特权。如果您使用的是Python 3,这对您来说似乎是一个很好的相关解决方案:https://stackoverflow.com/a/21220966/7006570

不同之处在于,在那个问题中,提问者想要它以相反的顺序,但你没有,所以忽略[:: - 1]部分。然后你得到一个bytes对象,你可以写入一个文件。当然,长度并不总是4个字节。

bitstring = "10111111111111111011110"
bits = int(bitstring, 2)
bytes_ = bits.to_bytes((bits.bit_length()+7)//8, 'little')

然后保存

with open('/tmp/output', 'wb') as f:
    f.write(bytes_)