2010-06-03 6 views
4

나는 그 역 바이트 순서로 변수 $num을 변환하고 그것을 밖으로 인쇄하기 위해 노력하고있어 :역 바이트 순서로 변수를 인쇄하는 방법은 무엇입니까?

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

그것은 약간의 인쇄 할 수없는 문자 등과 잘 보이는 헥스 편집기에서 인쇄,하지만이 방법을 얻을 수 있습니다 그것은 콘솔에서 읽을 수 있습니까? 나는 이미이 시도 :

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

이 펄이 숫자가 아닌 인수에 대해 불평한다, 그래서 나는 pack 반환 문자열을 생각합니다. 모든 아이디어는 $num을 기반으로 콘솔에 0xb7dd1455을 어떻게 인쇄 할 수 있습니까?

답변

7

당신은 unpack를 사용해야합니다 : Michael Carman에서

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

코멘트 : 바이트 순서 수정 (<>가) 펄 V5.10의 +를 필요로주의하십시오. 이전 버전의 Perl에서는 NVtemplates을 대신 사용해야합니다.

2
my $num=0x5514ddb7; 
my $i = unpack('N', pack('V',$num)); 
printf("0x%x\n", $i); 

하지만이 작업을 수행 하시겠습니까? 32 비트마다 다릅니다. "왜 묻는가?"라는 질문이 필요합니다. 당신이 해결하려고하는 것보다 더 나은 것을 제안하기 위해서입니다.

펄 즐깁니다 주로-C 프로그래머로
1

, 내 즉각적인 본능은 슬라이스하고 비트 연산자 주사위 :

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

그러나이되는 펄이 같은 결과를 달성하기 위해 의심 할 여지없이 많은 방법이있다 , 그리고 아마 이것에 대한 좋은 perl 관용어가있을 것입니다.

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 
0

생각 나는 형식의 바이너리 파일을 검사해야하는 사람들을위한 차임 것입니다. 이것은 사양이 MySQL .frm 사양과 같이 Intel이 아닌 바이트 순서로 16 진수 값을 표시 할 때 사용합니다. sysread 크기를 늘려 더 큰 청크를 지정할 수 있습니다. pack/unpack 길이는 2 x sysread 값이어야합니다. offset + = [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++; 
} 
0
$num = 0x5514ddb7; 
print '0x', sprintf('%08x', $num) =~ /../g; 
관련 문제