如何以相反的字节顺序打印变量?

Posted

技术标签:

【中文标题】如何以相反的字节顺序打印变量?【英文标题】:How to print a variable in reversed byte order? 【发布时间】:2010-06-03 15:11:07 【问题描述】:

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

my $num = 0x5514ddb7;
my $s = pack('I!',$num);
print "$s\n";

它打印为一些不可打印的字符,在十六进制编辑器中它看起来正确,但我怎样才能让它在控制台上可读?我已经试过了:

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

这使得 perl 抱怨一个非数字参数,所以我认为pack 返回一个字符串。有什么想法可以基于$num在控制台上打印出0xb7dd1455

【问题讨论】:

【参考方案1】:

你需要使用unpack:

my $num = 0x5514ddb7;
my $s = pack('I<!',$num);
my $x = unpack('I>!',$s);
printf("%#x\n",$x);

来自Michael Carman 的评论:请注意字节顺序修饰符(&lt;&gt;)需要 Perl v5.10+。对于旧版本的 Perl,您必须改用 NV templates。

【讨论】:

【参考方案2】:
my $num=0x5514ddb7;
my $i = unpack('N', pack('V',$num));
printf("0x%x\n", $i);

但是您确定要这样做吗? 它是 32 位特定的。 问题是“你为什么问?”为了提出比您要解决的问题更好的建议。

【讨论】:

【参考方案3】:

你需要使用CORE::unpack()"H"(大写H):

H   A hex string (high nybble first).

my $num=0x5514ddb7;
my $s=pack('I!',$num);
print unpack ("H*", "$s") . "\n"; # b7dd1455

【讨论】:

【参考方案4】:

作为一个涉足 perl 的主要 C 程序员,我的直觉是使用按位运算符进行切片和切块:

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

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

【讨论】:

【参考方案5】:

我想我会为我们这些需要检查格式化二进制文件的人插话。当规范以非英特尔字节顺序(如 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++;

【讨论】:

【参考方案6】:
$num = 0x5514ddb7;
print '0x', sprintf( '%08x', $num ) =~ /../g;

【讨论】:

以上是关于如何以相反的字节顺序打印变量?的主要内容,如果未能解决你的问题,请参考以下文章

小端字节顺序(在C中)

使用 range() 以相反的顺序打印列表?

是否可以以相反的顺序使System.out.print排序变量?

彩色字符串以相反的顺序打印而不是向前

以相反的顺序打印数字的数字

为啥合并打印顺序相反