MrSpoocy: unpack liefert falschen Wert :/

Hi,

ich habe eine Datei, diese lese ich im binmode ein..

	my $fh = IO::File->new();  
	if (!$fh->open("< ".$file))  
	{  
		return 0;  
	}  
  
	binmode($fh);

danach lese ich 4 Byte dieser Datei mit...
read($fh, my $offset, 4);

Nun wandelt ich diesen in einen UINT um ...
$Loffset = unpack ("I", $offset);

Normaler weise sollte ich folgenden Wert erhalten: 898544
Woher habe ich diesen wert ? Nun ich habe die Datei mit einem HEX Editor (UltraEdit) geäffnet. Habe dann den HEX Code der 4 Byte genommen (F0 B5 0D 00) und mit dem Windows Taschenrechner von Hex in Dez umgewandelt. Die zahl ist auch richtig wenn ich dann diese abgleiche (zu beachten ist das der HEX code umgedreht werden muss !).

Warum aber gibt unpack mir eine andere zahl aus ? Auch wenn ich reverse anwende kommt eine andere Zahl raus.
$Loffset = unpack ("I", reverse($offset));

Um zu prüfen ob ich überhaupt richtig auslese habe ich die 4 Byte mal in HEX mit folgender Funktion ausgeben lassen...

sub getHex {  
	my ($self, $data) = @_;  
	my $i;  
	my $return;  
  
	for ($i = 0; $i < length($data); $i++)  
	{  
		$return .= uc(unpack("H2",substr($data, $i, 1)));  
		if ($i + 1 < length($data))  
		{  
			$return .= " ";  
		}  
	}  
	return $return;  
}

und ja, wenn ich print getHex($offset); mache bekomme ich F0 B5 0D 00.

Wo ist mein fehler :/

  1. Aus mir nicht bekannten gründen geht es nun doch :/

  2. hi,

    endlich mal wieder bischen was in Perl ;)

    Um zu prüfen ob ich überhaupt richtig auslese habe ich die 4 Byte mal in HEX mit folgender Funktion ausgeben lassen...

    sub getHex {

    my ($self, $data) = @_;
    my $i;
    my $return;

    for ($i = 0; $i < length($data); $i++)
    {
    $return .= uc(unpack("H2",substr($data, $i, 1)));
    if ($i + 1 < length($data))
    {
    $return .= " ";
    }
    }
    return $return;
    }

      
    Das können wir schön viel kürzer machen, guck mal:  
    ~~~perl
      
    my $bin = pack "I", 898544; # erzeuge 4 bytes  
    printf "%02X %02X %02X %02X", unpack("CCCC", $bin);  
    # F0 B5 0D 00  
    
    

    2. Zeile Von r.n.l.:

    • Schablone "C" steht für Character, unpack "C" liefert den numerischen Wert eines Bytes in dezimal (CCCC für 4 bytes),
    • Format %02X macht aus der Dezimalzahl eine zweistellige Hexzahl mit großen Buchstaben.

    Hotti