解决这个问题的唯一方法是:
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 上测试