簡體   English   中英

如何將字符串轉換為修改后的十六進制表示?

[英]How to turn a string into a modified hex representation?

我想把一個字符串像

AaAa

進入

像這樣的字符串

%<41>%<61>%<41>%<61>

使用我熟悉的編程語言足夠簡單,但是使用 bash 我無法正確執行我想要做的事情:

  • 將字符串拆分為字符數組
  • 將每個字符轉換為十六進制
  • 將每個十六進制值包裝成%<FF>
  • 連接字符串

這是我目前的方式,讓我走到了一半:

echo -n "AaAa" | od -A n -t x1

如果您已經在使用od

printf "%%<%s>" $(od -A n -t x1<<<"AaAa")

對於沒有od的全bash,

while read -r -N 1 c; do printf "%%<%02X>" "$( printf "%d" \'$c )"; done <<< AaAa

這種方法的缺點是它為每個字符生成一個子外殼,並假定為 ASCII/UTF8。


編輯

@Shawn 指出您不需要子外殼 -

while read -r -N 1 c; do printf "%%<%02X>" \'$c; done <<< AaAa

不過,我注意到這些將字符串終止符留在您的輸出中,並意識到我可以通過將數據分配給變量並使用內置解析工具來消除它和read

$: x=AaAa && for((i=0;i<${#x};i++)); do printf "%%<%02X>" \'${x:i:1}; done; echo
%<41>%<61>%<41>%<61>

一個簡單的 Perl 替換就可以解決問題:

echo -n AaAa | perl -pe's/(.)/ sprintf "%%<%02X>", ord($1) /seg'

更短:

echo -n AaAa | perl -ne'printf "%%<%02X>", $_ for unpack "C*"'

在這兩種情況下,輸出都是預期的

%<41>%<61>%<41>%<61>

(沒有添加尾隨換行。如果你想要一個,附加; END { print "\\n" } 。)

你可以使用

echo -n AaAa | perl -ne 'for $c (split//) { printf("%%<%02X>", ord($c)); }'

輸出

%<41>%<61>%<41>%<61>

您可以通過管道傳輸到sed以將每個字節包裝在%<> ,然后刪除空格。

echo -n "AaAa" | od -A n -t x1 | sed -E -e 's/[a-z0-9]+/%<&>/g' -e 's/ //g'

也許awk

echo -n "AaAa" |
od -A n -t x1 |
awk 'BEGIN { ORS = "" } { for (i = 1; i <= NF; i+=1) print "%<"$i">"}'

暫無
暫無

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

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