如何将1和0的字符串写入二进制文件?
我想把一串由1和0组成的字符串转换成一个真正的二进制文件。如果直接把这串1和0写入文件的话,文件里只会是“00110001”和“00110000”这样的ASCII字符。我更希望用Python或者直接在bash命令行中完成这个,但用Java或C语言也可以。这可能只用一次。
谢谢。
5 个回答
任何能够进行位移操作的语言都可以组合任意进制的数字。我很喜欢不同语言在处理这些操作时的各种方式和技巧,但永远不要忘记,这背后其实是一些非常基础的数学知识。
在这个例子中,二进制就是简单的2的幂,所以:
1 << 1 = 1
1 << 2 = 2
1 << 3 = 4
1 << 4 = 8
等等……
如果你拿到一个二进制字符串:10100101,你可以很容易地将它转换成一个字节,方法如下:
(1 << 7) + (0 << 6) + (1 << 5) + (0 << 4) + (0 << 3) + (1 << 2) + (0 << 1) + 1
假设你已经把每个“0”或“1”先转换成了数字格式。
如果你处理的位数超过上面提到的8位,这个过程可能会变得有点繁琐,但因为你是一次处理一个字节,所以在你选择的编程语言中,简单的字节数组就足够了,这样你可以依次添加每个字节。
值得一提的是,同样的过程也可以用于其他进制,如果你没有位移的功能,简单的乘法通常也能很好地工作。
如果你在顶部用二进制标记你的列,你就能很清楚地理解我在说什么……以上面的例子为例(记住,这都是2的幂):
1 0 1 0 0 1 0 1
128 64 32 16 8 4 2 1 = 128 + 32 + 4 + 1 = 165
这不是问题的一部分,但相关……并且进一步说明:
十六进制的值是从0到F(共16个值),每个值可以放入4位……所以
1010 0101 (8+2) (4+1) - Binary using powers of 2 only on 4 bits (8 4 2 1)
10 5 (Decimal) - (10 << 4) + 5 = 165
A 5 (Hexadecimal)
如果你需要转换的字符超过8个(我想你肯定是),那么你可以用下面这个方法(使用Python):
>>> b = '0010101001010101010111101010100101011011'
>>> bytearray(int(b[x:x+8], 2) for x in range(0, len(b), 8))
bytearray(b'*U^\xa9[')
这个方法会把你的比特字符串分成8个字符一组(如果你的字符串长度不是8的倍数,记得先补齐),然后把每一组转换成一个整数,最后把这些整数放到一个bytearray
里,这样就可以直接写入你的二进制文件了(不需要再转换成字符串):
>>> with open('somefile', 'wb') as f:
... f.write(the_bytearray)
如果你还有类似的任务,可以使用一些库来帮助你,比如这里用我的bitstring模块做同样的转换:
>>> from bitstring import BitArray
>>> with open('somefile', 'wb') as f:
... BitArray(bin=b).tofile(f)
在Python中,可以使用内置的 int
函数把由0和1组成的字符串转换成数字:
>>> int("00100101", 2)
37
接着,可以用内置的 chr
函数把一个8位的整数(也就是范围在0到255之间的数字)转换成一个字符。
>>> chr(_)
'%'
通过 chr
得到的结果可以直接用 file.write
方法写入一个以二进制模式打开的文件中。