Perl 如何以反向字节顺序打印变量?

Perl 如何以反向字节顺序打印变量?,perl,pack,unpack,Perl,Pack,Unpack,我正在尝试将变量$num转换为其反向字节顺序并打印出来: my $num = 0x5514ddb7; my $s = pack('I!',$num); print "$s\n"; 它是作为一些不可打印的字符打印的,在十六进制编辑器中它看起来是正确的,但是如何在控制台上使它可读?我已经试过了: print sprintf("%#x\n",$s); 这使得perl抱怨非数字参数,因此我认为pack返回字符串。您知道如何根据$num在控制台上打印0xb7dd1455?您需要使用解包: my $nu

我正在尝试将变量
$num
转换为其反向字节顺序并打印出来:

my $num = 0x5514ddb7;
my $s = pack('I!',$num);
print "$s\n";
它是作为一些不可打印的字符打印的,在十六进制编辑器中它看起来是正确的,但是如何在控制台上使它可读?我已经试过了:

print sprintf("%#x\n",$s);

这使得perl抱怨非数字参数,因此我认为
pack
返回字符串。您知道如何根据
$num
在控制台上打印
0xb7dd1455

您需要使用
解包

my $num = 0x5514ddb7;
my $s = pack('I<!',$num);
my $x = unpack('I>!',$s);
printf("%#x\n",$x);
my$num=0x5514ddb7;
我的$s=包装('I!',$s);
printf(“%#x\n”,$x);
注释:注意字节顺序修饰符(
)需要PerlV5.10+。对于较旧版本的Perl,您必须使用
N
V

但你确定要这么做吗? 它是32位特定的。
这个问题需要一个“你为什么要问?”来提出一些比你试图解决的问题更好的建议。

作为一个涉足perl的C程序员,我的直觉是使用位运算符进行切分:

$n2 = ($num & 0xff) <<24
    | ($num & 0xff00) <<8
    | ($num & 0xff0000) >>8
    | ($num & 0xff000000) >>24 ;
$n2=($num&0xff)24;

但是,作为perl,无疑有很多方法可以达到相同的结果,而且可能有一个很好的perl习惯用法。

您需要使用
CORE::unpack()
“H”
(大写H):


我想我会为我们这些需要检查格式化二进制文件的人插话。这就是我在规范以非英特尔字节顺序显示十六进制值(如MySQL.frm规范)时使用的方法。您可以通过增加sysread大小来指定更大的块。打包/解包长度必须为sysread值的2倍。偏移量+=[设置为sysread值]

#!/usr/bin/perl
BEGIN {
    use Getopt::Long;

    $reverse=0;
    GetOptions ("reverse" => \$reverse);

}

my $f=STDIN;
if (int(@ARGV))
{
    open(IN, $ARGV[0]) or die "Failed to open $ARGV[0] for reading.\n$!";
    $f=IN;
}

my $count=1;
my $offset=0;
my $after_nl=1;
while (sysread($f,$buf,2))
{
    my $hex = unpack('H4', $buf);
    $hex=join("",(split(//,$hex))[2,3,0,1]) unless $reverse;
    if (($count % 8) == 0)
    {
        printf "%s\n", $hex;
        $after_nl=1;
        $offset += 2;
    }
    else
    {
        printf "%08x ", $offset if $after_nl;
        printf "%s ", $hex;
        $offset += 2;
        $after_nl=0;
    }

    $count++;
}
H   A hex string (high nybble first).

my $num=0x5514ddb7;
my $s=pack('I!',$num);
print unpack ("H*", "$s") . "\n"; # b7dd1455
#!/usr/bin/perl
BEGIN {
    use Getopt::Long;

    $reverse=0;
    GetOptions ("reverse" => \$reverse);

}

my $f=STDIN;
if (int(@ARGV))
{
    open(IN, $ARGV[0]) or die "Failed to open $ARGV[0] for reading.\n$!";
    $f=IN;
}

my $count=1;
my $offset=0;
my $after_nl=1;
while (sysread($f,$buf,2))
{
    my $hex = unpack('H4', $buf);
    $hex=join("",(split(//,$hex))[2,3,0,1]) unless $reverse;
    if (($count % 8) == 0)
    {
        printf "%s\n", $hex;
        $after_nl=1;
        $offset += 2;
    }
    else
    {
        printf "%08x ", $offset if $after_nl;
        printf "%s ", $hex;
        $offset += 2;
        $after_nl=0;
    }

    $count++;
}
$num = 0x5514ddb7;
print '0x', sprintf( '%08x', $num ) =~ /../g;