bash中的xxd:删除行号和ascii

问题描述

所以我想知道在使用xxd输出数据时如何删除行号和ascii。

代码

chst1="$(xxd -u -p -l1 -s 765 "$d2s")"
chst2="$(xxd -u -p -l1 -s 766 "$d2s")"
chst3="$(xxd -u -p -l1 -s 767 "$d2s")"
chst4="$(xxd -u -p -l1 -s 768 "$d2s")"
chst5="$(xxd -u -p -l1 -s 769 "$d2s")"
chst6="$(xxd -u -p -l1 -s 770 "$d2s")"
chst7="$(xxd -u -p -l1 -s 771 "$d2s")"
chst8="$(xxd -u -p -l1 -s 772 "$d2s")"
chst9="$(xxd -u -p -l1 -s 773 "$d2s")"

echo "Hex"
echo " $chst1 $chst2 $chst3 $chst4 $chst5 $chst6 $chst7 $chst8 $chst9 "
echo "Binary"
echo " $chst1 $chst2 $chst3 $chst4 $chst5 $chst6 $chst7 $chst8 $chst9 " | xxd -r -p | xxd -b

哪个输出

Hex
 67 66 00 28 08 F0 80 80 0C 
Binary
00000000: 01100111 01100110 00000000 00101000 00001000 11110000  gf.(..
00000006: 10000000 10000000 00001100                             ...

但是我要删除 00000000: 00000006: gf。(.. ... 输出中。

关于变量的数量,这是正确且丑陋的,但这是我唯一真正可行的解决方案,因为它们在代码中都是变量。

解决方法

Bash内置了相当不错的基本算术。但是我看不到也不需要一一提取十六进制数字。

echo Hex:
xxd -u -p -l 9 -s 765 "$d2s" | sed 's/../ &/g'
echo Bin:
xxd -u -b -l 9 -s 765 "$d2s" | cut -c 11-65

如果您真的坚持一一取出字节(也许实际上是在不同的非顺序偏移量处?),则可以将值收集到两个数组中。

hex=()
bin=()
for offset in 123 234 345 456; do
    hex+=("$(xxd -p -s "$offset" -l 1 -u "$d2s")")
    bin+=("$(xxd -b -s "$offset" -l 1 "$d2s" | awk '{ print $2 }')")
done
echo Hex:
printf " %s" "${hex[@]}"
printf "\n"
echo Bin:
printf " %s" "${bin[@]}"
printf "\n"

主要针对变体,这演示了如何使用Awk。通常,我会选择cut进行简单提取,在该提取中您知道要走的每一行有多远,但是Awk绝对更灵活。当子串的偏移量不一定固定时,它会很好地工作,但是您知道每一行有多少个字段。

如果要将标签与每个字节关联,并行数组也很方便。也许

labels=(Hunger Thirst "Need to pee" Arms Legs Velocity Strength)
...
for ((i=0; i<=${#labels[@]}; ++i)); do
  echo "${labels[i]}: ${hex[i]} (${bin[i]})"
done
,

欢迎来到!

首先,让我们不要产生太多的冗余进程。

 xxd -u -p -l9 -s 765 "$d2s" |
   perl -ne 'for my $o (0..16) { next if $o%2; printf "%08b ",substr($_,$o,2) }'
 01000011 01000010 00000000 00011100 00001000 00000000 01010000 01010000 00000000 

我没有添加换行符,但是我们可以添加。 如果您没有perl(快去拿!),那么

for offset in {0..16}
do (( offset%2)) && continue
   printf "%08d " $(bc <<< "ibase=16;obase=2;${sample:$offset:2}")
done
01100111 01100110 00000000 00101000 00001000 11110000 10000000 10000000 00001100 

同样,没有换行符,但是您似乎能够弄清楚这一点……但是现在我们再次生成了一系列proc。而是使用三元组的cut
让我知道您是否需要更多细节。