【问题标题】:How to separate the Hex 8 bits into two 4 bits如何将 Hex 8 位分成两个 4 位
【发布时间】:2020-09-19 19:04:33
【问题描述】:

我就是这样用的,

$a = "002c459f";
$b = $a%10000;
$c = int($a/10000); 
print $b;       #prints 0
print $c;       #prints 2

我想要

$b=459f;

$c=002c;

谁能建议我如何得到这个?

【问题讨论】:

    标签: perl modulus


    【解决方案1】:

    如果您使用过warnings,您会收到一条警告消息,指出存在问题。

    由于您的 8 位输入已经被格式化为一个简单的十六进制字符串,您可以使用 substr:

    use warnings;
    use strict;
    
    my $x = '002c459f';
    my $y = substr $x, 0, 4;
    my $z = substr $x, 4, 4;
    print "z=$z, y=$y\n";
    

    输出:

    z=459f, y=002c

    最好同时使用strict。我更改了你的变量名,因为 ab 是 Perl 中的特殊变量。

    【讨论】:

      【解决方案2】:

      您应该始终使用use strict; use warnings;!它会告诉你002c459f 不是一个数字。 (它是数字的十六进制表示。)因此,在首先将其转换为数字之前,您不能使用除法。您还使用了错误的除数(10000 而不是0x10000)。

      my $a_num = hex($a_hex);
      
      my $b_num = $a_num % 0x10000;         # More common: my $b_num = $a_num & 0xFFFF;
      my $c_num = int( $a_num / 0x10000 );  # More common: my $c_num = $a_num >> 16
      
      my $b_hex = sprintf("%04x", $b_num);
      my $c_hex = sprintf("%04x", $c_num);
      

      但如果你正好有八个字符,你可以使用以下代替:

      my ($c, $b) = unpack('a4 a4', $a);
      

      注意:您应该避免使用$a$b,因为它可能会干扰sort 和一些subs。

      【讨论】:

        【解决方案3】:

        输入数据是一个十六进制字符串,正则表达式可以将字符串拆分 4个字符组成一个数组。

        此时可以使用result作为字符串,也可以使用hex()将十六进制字符串表示转换为perl内部的数字表示。

        use strict;
        use warnings;
        use feature 'say';
        
        my $a = "002c459f";         # value is a string
        
        my($b,$c) = $a =~ /([\da-f]{4})/gi;
        
        say "0x$b 0x$c\tstrings";   # values are strings
        
        $b = hex($b);               # convert to digit
        $c = hex($c);               # convert to digit
        
        printf "0x%04x 0x%04x\tdigits\n", $b, $c;
        

        输出

        0x002c 0x459f   strings
        0x002c 0x459f   digits
        

        【讨论】:

        • 为什么只从十六进制转换为立即转换为十六进制?代码不清楚。
        • @ikegami -- OP 的意图从他的问题中不清楚,他需要一个字符串还是数字?
        猜你喜欢
        • 2011-06-01
        • 2023-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 2013-12-01
        • 1970-01-01
        相关资源
        最近更新 更多