簡體   English   中英

bash 中的 xxd:刪除行號和 ascii

[英]xxd in bash: remove line numbers and 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.(.. and ...從輸出中刪除。

至於變量的數量,這是正確和丑陋的,但這是我唯一真正有效的解決方案,因為它們每個都是代碼中自己的變量。

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

歡迎來到 SO!

首先,我們不要產生如此多的冗余進程。

 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 

再次,沒有換行符,但你似乎能夠弄清楚……但現在我們又產生了一堆觸發。 而不是那個,使用三重奏的cut
如果您想要更多細節,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM