【问题标题】:BINARY TO ASCII conversion using 'xxd'使用 'xxd' 进行二进制到 ASCII 转换
【发布时间】:2018-08-11 00:51:12
【问题描述】:

我知道如何将十六进制转储转换为 ASCII。

echo 54 58 72 56 etc | xxd -r -p -> 将产生 ASCII 输出

但我正在努力将以下二进制代码转换为 ASCII。

01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010

我需要使用 'xxd' 或尽可能短的类似命令来执行此操作。

提前谢谢你!

【问题讨论】:

  • 如果您对@kabanus 的回答感到满意,请接受他/她的回答。

标签: binary ascii


【解决方案1】:

如果要坚持使用xxd,则需要先将每个二进制数转换为十进制。如果你使用bash,而x包含你是二进制字符串,那么:

for a in $x; do printf "%x" $((2#$a)); done | xxd -r -p 

$((2#$a)) 是 bash 中的二进制到十进制转换,printf 会将其转换为十六进制。然后将其通过管道发送到xxd - 并得到你之前得到的东西。

你是不是有点不适合冲锋队?

如果字符串包含在文件中,则逐行读取,然后逐字读取。另一种选择是只使用printf,但是你需要八进制数,所以使用printf 两次:

for a in $x; do printf \\$(printf "%o" $((2#$a))); done

实际上最后一个也可以用hex 完成,只需使用\\ 而不是\\x%o 恢复为%x

【讨论】:

  • 谢谢!这就是我一直在寻找的。​​span>
  • @Seba 在这里无需感谢。如果答案是为了未来读者的利益,请接受答案,为额外的自信点赞。祝你好运。
【解决方案2】:

解决这个问题的唯一方法是:

data=$(cat file.in); echo $(printf '%x\n' "$((2#$data))") | xxd -r -p > file.out

问题是 printf 似乎有字符限制,可以通过将数据标记为您的装备可以处理的块来解决,例如。每个 8 个字节(在我的 Ubuntu 16.04.7 上)

一种解决方法是一次循环一个字符(字节序列)或循环文件中的行

data=$(cat file.in); for byte in $data; do echo $(printf '%x\n' "$((2#$byte))"); done | xxd -r -p

在拆分成单词之前无需转换为八进制或逐行读取。

dictionary/database/array 可能是另一种较慢的解决方案(如果您有足够的内存或不想将数据存储在文件中):

D2B=(01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010); 
count=${#D2B[@]}; 
run='D2C=('${D2B[@]}'); for word in {0..'$count'}; do echo -n $(printf '%x' "$((2#${D2C[$word]}))"); done;';
echo "$run" | bash | xxd -r -p

字符串解决方案传递给数组以获得更快的响应:

dat="01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010"; 
count=$(echo $dat ^| wc -w); 
run='D2C=('$dat'); for word in {0..'$count'}; do echo -n $(printf '%x' "$((2#${D2C[$word]}))"); done;'; 
echo "$run" | bash | xxd -r -p

仅字符串解决方案(无数组):

dat="01000001 01110010 01100101 01101110 00100111 01110100 00100000 01111001 01101111 01110101 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110011 01101000 01101111 01110010 01110100 00100000 01100110 01101111 01110010 00100000 01100001 00100000 01110011 01110100 01101111 01110010 01101101 00100000 01110100 01110010 01101111 01101111 01110000 01100101 01110010 00111111 00001101 00001010"; 
count=$(echo $dat ^| wc -w); 
run='D2C="'$dat'"; for word in {0..'$count'}; do byte=${D2C:$((word+8*word)):8}; echo -n $(printf '%x' "$((2#$byte))"); done;'; 
echo "$run" | bash | xxd -r -p

在 Ubuntu 16.04.7 上测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2020-10-14
    • 2012-11-14
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多