首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash中的xxd :删除行号和ascii

bash中的xxd :删除行号和ascii
EN

Stack Overflow用户
提问于 2020-08-24 13:56:28
回答 2查看 574关注 0票数 0

因此,我想知道如何在使用xxd输出数据时删除linenumbers和ascii。

代码:

代码语言:javascript
复制
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

输出

代码语言:javascript
复制
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.(..从输出中删除。

至于变量的数量,这是正确和丑陋的,但这是我唯一真正的工作解决方案,因为它们都是代码中各自的变量。

EN

回答 2

Stack Overflow用户

发布于 2020-08-24 14:25:15

巴什有相当不错的基本算法内置。但我也看不出需要一个接一个地提取六角数。

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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绝对是更通用的。当子字符串偏移量不一定是固定的,但您知道每行有多少字段时,它工作得很好。

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

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-08-24 14:31:21

欢迎来到这里!

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

代码语言:javascript
复制
 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 (去拿吧!),那么

代码语言:javascript
复制
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 

再说一遍,没有新的台词,但你似乎能弄明白.但现在我们又产生了一堆麻烦。而不是那样,使用tripleee的cut

如果你想要更多的细节请告诉我。

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

https://stackoverflow.com/questions/63562518

复制
相关文章

相似问题

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