繁体   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