RSF*_*on7 42 bash ascii binary
哪个是将 ASCII 转换为二进制以及将二进制转换为 ASCII 的好工具?
我希望是这样的:
$ echo --binary "This is a binary message"
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
Run Code Online (Sandbox Code Playgroud)
或者,更现实的:
$ echo "This is a binary message" | ascii2bin
01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
Run Code Online (Sandbox Code Playgroud)
还有相反的:
$ echo "01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101" | bin2ascii
This is a binary message
Run Code Online (Sandbox Code Playgroud)
PS:我正在使用 bash
PS2:我希望我没有得到错误的二进制文件
Sté*_*las 47
$ echo AB | perl -lpe '$_=unpack"B*"'
0100000101000010
$ echo 0100000101000010 | perl -lpe '$_=pack"B*",$_'
AB
Run Code Online (Sandbox Code Playgroud)
-e expression
将给定的表达式计算为perl
代码-p
:sed
模式。该表达式为每个输入线进行评价时,与存储在该行的内容$_
变量和后评价印刷表达。-l
: 更像是sed
: 而不是整行,只有行的内容(即没有行分隔符)在$_
(并且在输出中添加了换行符)。因此,perl -lpe code
工作方式类似sed code
,只是它的perl
代码,而不是sed
代码。unpack "B*"
工作在$_
默认变量,并提取其作为从第一个字节到最后一个字节的最低位的最高位的比特串行走的内容。pack
做相反的事情unpack
。详情请参阅perldoc -f pack
。带空格:
$ echo AB | perl -lpe '$_=join " ", unpack"(B8)*"'
01000001 01000010
$ echo 01000001 01000010 | perl -lape '$_=pack"(B8)*",@F'
AB
Run Code Online (Sandbox Code Playgroud)
(它假设输入是 8 位块(0 填充))。
使用unpack "(B8)*"
,我们一次提取 8 位,然后用 将结果字符串与空格连接起来join " "
。
slm*_*slm 35
您可以使用xxd
ASCII 和二进制进行转换。
$ echo -n "A" | xxd -b
0000000: 01000001 A
$ echo -n "A" | xxd -b | awk '{print $2}'
01000001
Run Code Online (Sandbox Code Playgroud)
如果您只想在十六进制、八进制和十二进制之间进行基本转换,我通常会使用基本的计算器命令行工具 ( bc
) 来执行此类操作。请注意,bc
对于碱基的正确顺序总是非常挑剔:您必须首先指定结果碱基 ( obase
),然后添加您选择的ibase
.
$ echo "obase=2; ibase=16; A" | bc
1010
$ echo "obase=16; ibase=2; 1010" | bc
A
Run Code Online (Sandbox Code Playgroud)
Fre*_*rdt 12
使用 bc 和 bash:
#!/bin/bash
chrbin() {
echo $(printf \\$(echo "ibase=2; obase=8; $1" | bc))
}
ordbin() {
a=$(printf '%d' "'$1")
b=$(echo "obase=2; $a" | bc)
printf '%08d' $b
}
ascii2bin() {
echo -n $* | while IFS= read -r -n1 char
do
ordbin $char | tr -d '\n'
echo -n " "
done
}
bin2ascii() {
for bin in $*
do
chrbin $bin | tr -d '\n'
done
}
ascii2bin "This is a binary message"
bin2ascii 01010100 01101000 01101001 01110011 00100000 01101001 01110011 00100000 01100001 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000 01101101 01100101 01110011 01110011 01100001 01100111 01100101
Run Code Online (Sandbox Code Playgroud)
将二进制转换为ascii的Shell解决方案:
bin2ascii() { { tr -cd 01 | fold -w8; echo; } | sed '1i obase=8; ibase=2' | bc | sed 's/^/\\/' | tr -d '\n' | xargs -0 echo -e; }
Run Code Online (Sandbox Code Playgroud)
对于
[ -~]
Python 2范围内的 ASCII 字符:Run Code Online (Sandbox Code Playgroud)>>> import binascii >>> bin(int(binascii.hexlify('hello'), 16)) '0b110100001100101011011000110110001101111'
相反:
Run Code Online (Sandbox Code Playgroud)>>> n = int('0b110100001100101011011000110110001101111', 2) >>> binascii.unhexlify('%x' % n) 'hello'
在 Python 3.2+ 中:
Run Code Online (Sandbox Code Playgroud)>>> bin(int.from_bytes('hello'.encode(), 'big')) '0b110100001100101011011000110110001101111'
相反:
Run Code Online (Sandbox Code Playgroud)>>> n = int('0b110100001100101011011000110110001101111', 2) >>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode() 'hello'