假设我们有一些转换成utf8的东西,我们从其中提取二进制文件,例如:
echo "hello world" | xxd -p -b
我们得到以下输出:
00000000: 01101000 01100101 01101100 01101100 01101111 00100000 hello
00000006: 01110111 01101111 01110010 01101100 01100100 00001010 world.
使用cut时,我们只获取部分内容:
01101000 01100101 01101100 01101100 01101111 00100000
01110111 01101111 01110010 01101100 01100100 00001010
有没有办法逆转这个过程,从这个比特中得到一个utf8 (而不是ascii!)字符串?
发布于 2018-06-05 00:33:56
听起来您想要将xxd -b
输出转换回初始的hello world
字符串?
[STEP 103] # echo hello, world | xxd -b
00000000: 01101000 01100101 01101100 01101100 01101111 00101100 hello,
00000006: 00100000 01110111 01101111 01110010 01101100 01100100 world
0000000c: 00001010 .
[STEP 104] # echo hello, world | xxd -b \
| sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
-e 's/ ([01]+)/ $((2#\1))/g' \
| xargs bash -c 'eval printf %02x "$@" ' _ \
| xxd -p -r
hello, world
[STEP 105] #
(如果sed
命令不支持-E
,则需要更新该命令。)
一步一步:
[STEP 106] # echo xyz | xxd -b
00000000: 01111000 01111001 01111010 00001010 xyz.
[STEP 107] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
-e 's/ ([01]+)/ $((2#\1))/g'
$((2#01111000)) $((2#01111001)) $((2#01111010)) $((2#00001010))
[STEP 108] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
-e 's/ ([01]+)/ $((2#\1))/g' \
| xargs bash -c 'echo printf %02x "$@" ' DOLLAR0
printf %02x $((2#01111000)) $((2#01111001)) $((2#01111010)) $((2#00001010))
[STEP 109] # printf %02x $((2#01111000)) $((2#01111001)) $((2#01111010)) $((2#00001010))
78797a0a
[STEP 110] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
-e 's/ ([01]+)/ $((2#\1))/g' \
| xargs bash -c 'eval printf %02x "$@" ' DOLLAR0
78797a0a
[STEP 111] # echo xyz | xxd -b | sed -E -e 's/.*:(( [01]+){0,6}).*/\1/' \
-e 's/ ([01]+)/ $((2#\1))/g' \
| xargs bash -c 'eval printf %02x "$@" ' DOLLAR0 | xxd -p -r
xyz
[STEP 112] #
在STEP 108
中,我使用echo
而不是eval
,因此您可以看到命令xargs
实际产生了什么。
https://stackoverflow.com/questions/50684061
复制相似问题