首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >"xxd -b“可以将数据转换为位字符串(例如:"A”→"01000001"),但是如何进行相反的操作呢?

"xxd -b“可以将数据转换为位字符串(例如:"A”→"01000001"),但是如何进行相反的操作呢?
EN

Stack Overflow用户
提问于 2018-06-04 23:29:41
回答 1查看 557关注 0票数 2

假设我们有一些转换成utf8的东西,我们从其中提取二进制文件,例如:

代码语言:javascript
复制
echo "hello world" | xxd -p -b

我们得到以下输出:

代码语言:javascript
复制
00000000: 01101000 01100101 01101100 01101100 01101111 00100000  hello 
00000006: 01110111 01101111 01110010 01101100 01100100 00001010  world.

使用cut时,我们只获取部分内容:

代码语言:javascript
复制
01101000 01100101 01101100 01101100 01101111 00100000
01110111 01101111 01110010 01101100 01100100 00001010

有没有办法逆转这个过程,从这个比特中得到一个utf8 (而不是ascii!)字符串?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 00:33:56

听起来您想要将xxd -b输出转换回初始的hello world字符串?

代码语言:javascript
复制
[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,则需要更新该命令。)

一步一步:

代码语言:javascript
复制
[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实际产生了什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50684061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档