代码之家  ›  专栏  ›  技术社区  ›  Chris Huang-Leaver

如何在Perl中将十六进制字符串转换为数字?

  •  18
  • Chris Huang-Leaver  · 技术社区  · 16 年前

    我最近写了一个脚本,它解析单个二进制字节月份字段的文本表示形式。

    (不要问:-{)

    在摆弄了一段时间sprintf之后,我放弃了,做了这个;

    our %months = qw / x01 1 
           x02 2
           x03 3 
           x04 4 
           x05 5 
           x06 6 
           x07 7 
           x08 8 
           x09 9 
           x0a 10 
           x0b 11 
           x0c 12 /;
    ...
    my $month = $months{$text};
    

    因为我只使用了12个数字,所以我可以侥幸逃脱,但是有没有更好的方法呢?

    3 回复  |  直到 11 年前
        1
  •  36
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    如果你有

    $hex_string = "0x10";
    

    $hex_val = hex($hex_string);
    

    您将得到: $hex_val == 16

    hex 不需要“ 0x “在字符串的开头。如果它丢失了,它仍然会将十六进制字符串转换为数字。

    你也可以使用 oct 要根据前缀将二进制、八进制或十六进制字符串转换为数字,请执行以下操作:

    • 0b
    • 0
    • -六角形
        2
  •  7
  •   Sinan Ünür    16 年前

    看见 hex 和/或 oct

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my @months = map hex, qw/x01 x02 x03 x04 x05 x06 x07 x08 x09 x0a x0b x0c/;
    print "$_\n" for @months;
    
        3
  •  3
  •   Sinan Ünür    16 年前

    如果我理解正确,您每月有1个字节-不是字符串“0x10”,而是包含10的字节。

    这样,您应该使用 unpack :

    my $in = "\x0a";
    print length($in), "\n";
    my ($out) = unpack("c", $in);
    print length($out), "\n", $out, "\n"
    

    输出:

    1
    2
    10
    

    如果输入为3个字符,如“x05”,则更改也非常简单:

    my $in = "x0a";
    my $out = hex($in);
    
        4
  •  0
  •   WhiteMist    4 年前

    对于直接转换字符串中包含的十六进制,这里有另一种可能更实用的方法。

    这将在s///上使用/e(e表示eval)正则表达式修饰符。

    从这个字符串开始:

    $hello_world = "\\x48\\x65\\x6c\\x6c\\x6f\\x20\\x57\\x6f\\x72\\x6c\\x64";

    六位小数到字符:

    print $hello_world =~ s/\\x([0-9a-fA-F]{2})/chr hex $1/gre;

    十六进制数到十进制数:

    print $hello_world =~ s/\\x([0-9a-fA-F]{2})/hex $1/gre;

    删除/r修改器以替换在位的字符串。

    有一天,我使用了一个python脚本来处理一个二进制文件,我被一个只包含十六进制数字的字节文本(b'\x09\xff…')所困扰。 我设法用一个单行程序返回我的字节,这是上面的一个变体。