4

$num変数を逆のバイト順に変換して出力しようとしています:

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

印刷できない文字として印刷され、16 進エディターでは正しく表示されますが、コンソールで読み取るにはどうすればよいですか? 私はすでにこれを試しました:

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

packこれにより、perl は数値以外の引数について不平を言うので、文字列を返すと思います。0xb7dd1455に基づいて、コンソールにどのように印刷でき$numますか?

4

6 に答える 6

7

使用する必要がありますunpack

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

Michael Carmanからのコメント: バイト順修飾子 (<および>) には Perl v5.10+ が必要であることに注意してください。古いバージョンの Perlでは、代わりにNV テンプレートを使用する必要があります。

于 2010-06-03T15:23:34.610 に答える
2
my $num=0x5514ddb7;
my $i = unpack('N', pack('V',$num));
printf("0x%x\n", $i);

しかし、あなたは本当にこれをしたいですか?これは 32 ビット固有です。質問は「なぜあなたは尋ねるのですか?」を求めます。解決しようとしているものよりも優れたものを提案するためです。

于 2010-06-03T15:23:52.397 に答える
2

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
于 2010-06-03T15:27:09.593 に答える
1

Perl に手を出すほとんど C のプログラマーとして、私の直観的な本能は、ビットごとの演算子を切り刻むことです。

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

しかし、これは perl であり、間違いなく同じ結果を達成するための多くの方法があり、これにはおそらく適切な perl イディオムがあります。

于 2010-06-03T15:24:16.013 に答える
0
$num = 0x5514ddb7;
print '0x', sprintf( '%08x', $num ) =~ /../g;
于 2013-08-22T23:08:04.440 に答える
0

フォーマットされたバイナリ ファイルを調べる必要がある私たちのことを考えてみてください。これは、MySQL .frm 仕様のように、Intel 以外のバイト順で仕様が 16 進値を示すときに使用するものです。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++;
}
于 2013-08-22T22:59:21.473 に答える