gpt4 book ai didi

perl - 在偶数位置匹配并删除不可打印的字符

转载 作者:行者123 更新时间:2023-12-01 22:07:57 25 4
gpt4 key购买 nike

我有一个来自数据库表转储的十六进制字符串,类似于

"41424320202020200A200B000C"

我想要做的是在偶数位置进行匹配并检测打印时可能破坏字符串的控制字符。即将 ascii null\x00、\n、\r、\f 和\x80 删除为\xFF等等.

我尝试删除 ascii null 就像

perl -e ' $x="41424320202020200A200B000C"; $x=~s/00//g; print "$x\n" '

但结果不正确,因为它从空格\x20 的尾随十六进制值和换行符\x0A 的前导 0 中删除了 0,即 20 0A2A

414243202020202A2B0C

我想要的是

414243202020202020

最佳答案

say unpack("H*", pack("H*", "41424320202020200A200B000C") =~ s/[^\t[:print:]]//arg);

my $hex = "41424320202020200A200B000C";
my $bytes = pack("H*", $hex);
$bytes =~ s/[^\t[:print:]]//ag;
$hex = unpack("H*", $bytes);
say $hex;

my $hex = "41424320202020200A200B000C";
my $bytes = pack("H*", $hex);
$bytes =~ s/[^\t\x20-\x7E]//g;
$hex = unpack("H*", $bytes);
say $hex;

使用 /a/r 的解决方案需要 Perl 5.14+。

<小时/>

以上内容以以下字符串开头:

 41424320202020200A200B000C

使用pack将其转换为以下内容:

 ABC␠␠␠␠␠␊␠␋␀␌

替换删除了除 TAB 之外的所有非 ASCII 和所有不可打印字符,留下以下内容:

 ABC␠␠␠␠␠␠

使用unpack将其转换为以下内容:

 414243202020202020
<小时/>

这个解决方案不仅比以前的解决方案更短,而且速度更快,因为它分配的变量少得多,并且只启动一次正则表达式匹配。

关于perl - 在偶数位置匹配并删除不可打印的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55935536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com