代码之家  ›  专栏  ›  技术社区  ›  Haspemulator

Perl:用regex将十六进制编码的字符串解析成数组

  •  5
  • Haspemulator  · 技术社区  · 14 年前

    我的脚本接收十六进制编码的字符串作为命令行参数。然后我必须解码这个字符串,并将它写入到输出文件,就像从数据中初始化的C++数组一样。例如:

    perl myscript.pl DEADBABEDEADBEEF

    const boost::array<char, 8> MyArray = { 0xDE, 0xAD, 0xBA, 0xBE, 0xDE, 0xAD, 0xBE, 0xEF };

    使用Perl regex的正确方法是什么?当然,我可以用子字符串在循环中执行它,但我相信应该有更优雅的方式。

    编辑:输入字符串的长度是固定的。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Eugene Yarmash    14 年前

    试试这个:

    my $hex = "DEADBABEDEADBEEF";
    my @a = map "0x$_", $hex =~ /(..)/g;
    

    $hex =~ /(..)/g /g map() "0x$_" $_ 这里是元素的别名)。

    perldoc -f map .

        2
  •  5
  •   user181548 user181548    14 年前

    这个怎么样:

    my $input = $ARGV[0];
    die "Fouled up input" unless $input =~ /^(?:[0-9A-F]{2})+$/i;
    my $bytes = length ($input) / 2;
    print "const boost::array<char, $bytes> MyArray = {";
    while ($input =~ s/([0-9A-F]{2})//i) {
        # print $input # to see how this works, see comment.
        print "0x$1, ";
    }
    print "};\n";
    
        3
  •  4
  •   deepakg    14 年前

    print join ",", unpack("(A2)*", "DEADBABEDEADBEEF");
    

    更正-您需要一个映射来为解包返回的每个元素加上前缀“0x”

    print join ",", map { '0x' . $_ } unpack("(A2)*", "DEADBABEDEADBEEF");