我有几个大文件(3-6 Gb)的1和0的ASCII字符,我想把它转换成一个简单的二进制文件。换行并不重要,应该放弃。
下面的test.bin是568字节,我想要560位文件。
0111000110000000101000100000100100011111010010101000001001010000111000
1001100011010100001101110000100010000010000000000001011000010011111100
0100001000010000010000010111011101011111000111111000111001100010100011
0011101000100001111111000001111110111111101101100000011000010101100001
0000000110110001000000000001000011110100000101101000001000010001010011
1101101111010101011110001110000010011001100101101101000111111101110101
1000001100101101010111110111110101100000000011001000100000000011001110
0101101001110010011110000100101001001111010011100100001001111111100110
...
我发现了另外一种解决方案,将二进制文件转换为ASCII而不是另一种方式。
理想情况下,我正在寻找一个简单的linux / bash解决方案,但我可以使用python解决方案。 ===================编辑==================
为了减少混淆,可以考虑将任意两个ASCII字符转换为二进制文件。
test_XY_encoded.txt
XYYYXXXYYXXXXXXXYXYXXXYXXXXXYXXYXXXYYYYYXYXXYXYXYXXXXXYXXYXYXXXXYYYXXX
YXXYYXXXYYXYXYXXXXYYXYYYXXXXYXXXYXXXXXYXXXXXXXXXXXXYXYYXXXXYXXYYYYYYXX
XYXXXXYXXXXYXXXXXYXXXXXYXYYYXYYYXYXYYYYYXXXYYYYYYXXXYYYXXYYXXXYXYXXXYY
XXYYYXYXXXYXXXXYYYYYYYXXXXXYYYYYYXYYYYYYYXYYXYYXXXXXXYYXXXXYXYXYYXXXXY
XXXXXXXYYXYYXXXYXXXXXXXXXXXYXXXXYYYYXYXXXXXYXYYXYXXXXXYXXXXYXXXYXYXXYY
YYXYYXYYYYXYXYXYXYYYYXXXYYYXXXXXYXXYYXXYYXXYXYYXYYXYXXXYYYYYYYXYYYXYXY
YXXXXXYYXXYXYYXYXYXYYYYYXYYYYYXYXYYXXXXXXXXXYYXXYXXXYXXXXXXXXXYYXXYYYX
XYXYYXYXXYYYXXYXXYYYYXXXXYXXYXYXXYXXYYYYXYXXYYYXXYXXXXYXXYYYYYYYYXXYYX
其中X代表二进制0,Y代表二进制1。
答案 0 :(得分:1)
我不知道这是否可以解决问题,但是如何解决这个问题:
with open('ascii.txt', 'r') as file_ascii, open('binary.txt', 'wb') as file_bin:
file_bin.write(bytes(''.join(file_ascii.read().split()), 'utf-8'))
或者,要覆盖文件:
with open('ascii.txt', 'r') as f:
binary = bytes(''.join(file_ascii.read().split()), 'utf-8')
with open('ascii.txt', 'wb') as f:
f.write(binary)
简短,但应该做到这一点。
答案 1 :(得分:1)
这个bash命令怎么样?
cat test.bin | tr -d '\n' | perl -lpe '$_=pack"B*",$_' > true_binary.txt
' TR'将删除所有换行符,perl命令将转换为二进制。
答案 2 :(得分:0)
我们可以建立一个只有贝壳的#34;解决方案。
首先,我们将1和0转换为8个字符行的流:
$ { cat test.bin | tr -cd '01' | fold -b8; echo; }
01110001
10000000
10100010
00001001
00011111
…
…
10011110
00010010
10010011
11010011
10010000
10011111
11100110
这是560/8行,或70行,应该转换为70个字符 应该说字符不是ASCII,高于十进制127(十六进制7f)的值是不是 ASCII。我将它们解释为字节值(无符号十进制值)。
然后我们可以读取每一行并将其首先转换为十进制"$((2#$a))"
,以便shell了解它们,然后转换为十六进制printf '\\x%x'
,以便最终的printf可以转换为十六进制字节printf '%b' "…"
:
$ { cat infile | tr -cd '01' | fold -b8; echo; } |
while read a; do printf '%b' "$(printf '\\x%x' "$((2#$a))")"; done
q�� J�P�cP�XO�!u���(Έ�큅a���OoU�f[G�X2���Ȁ3����Ӑ��
当然,打印的字符是(很可能)对用户正在使用的某些语言环境中的字节值的错误解释。也许十六进制输出会更有趣(但这取决于您的需求或兴趣):
$ { cat infile | tr -cd '01' | fold -b8; echo; } |
while read a; do printf '%b' "$(printf '\\x%x' "$((2#$a))")"; done |
od -vAn -tx1c
71 80 a2 09 1f 4a 82 50 e2 63 50 dc 22 08 00 58
q 200 242 \t 037 J 202 P 342 c P 334 " \b \0 X
4f c4 21 04 17 75 f1 f8 e6 28 ce 88 7f 07 ef ed
O 304 ! 004 027 u 361 370 346 ( 316 210 177 \a 357 355
81 85 61 01 b1 00 10 f4 16 82 11 4f 6f 55 e3 82
201 205 a 001 261 \0 020 364 026 202 021 O o U 343 202
66 5b 47 f7 58 32 d5 f7 d6 00 c8 80 33 96 9c 9e
f [ G 367 X 2 325 367 326 \0 310 200 3 226 234 236
12 93 d3 90 9f e6
022 223 323 220 237 346
请注意,相同的结构可用于文件test_XY_encoded.txt
:
$ { cat infile | tr 'XY' '01' | tr -cd '01' | fold -b8; echo; } |
while read a; do printf '%b' "$(printf '\\x%x' "$((2#$a))")"; done |
od -vAn -tx1c
71 80 a2 09 1f 4a 82 50 e2 63 50 dc 22 08 00 58
q 200 242 \t 037 J 202 P 342 c P 334 " \b \0 X
4f c4 21 04 17 75 f1 f8 e6 28 ce 88 7f 07 ef ed
O 304 ! 004 027 u 361 370 346 ( 316 210 177 \a 357 355
81 85 61 01 b1 00 10 f4 16 82 11 4f 6f 55 e3 82
201 205 a 001 261 \0 020 364 026 202 021 O o U 343 202
66 5b 47 f7 58 32 d5 f7 d6 00 c8 80 33 96 9c 9e
f [ G 367 X 2 325 367 326 \0 310 200 3 226 234 236
12 93 d3 90 9f e6
022 223 323 220 237 346