2010-06-21 11 views
2

Selon ce site de la calculatrice (link text), lors de la conversion 3 de diminuer pour le double, je me 4008 0000 0000 0000Perl pack utilisation - double big endian?

Lorsque vous utilisez la fonction pack Perl, avec le paramètre « d> * », je me attendais à voir 4008 0000 0000 0000 que j'utilise cette fonction:

print $File pack("d>*",3); 

mais quand je « Hexdump » dans le fichier de sortie Perl, je vois 0840 0000 0000 0000

je pensais qu'il pourrait appartenir au grand/petit-boutiste, mais en essayant le petit endian:

print $File pack("d<*",3); 

Je reçois ceci: 0000 0000 0000 4008

shell que je fais si je veux obtenir ce résultat 4008 0000 0000 0000 de sortie pack Perl?

Merci. À propos, lorsque vous utilisez "Float", tout fonctionne comme prévu.

Répondre

4

Votre intuition sur l'ordre des octets dans Perl est correcte, mais je pense que la sortie hexdump ne signifie pas ce que vous pensez qu'il fait. Il semble que hexdump affiche chaque paire d'octets dans un ordre cohérent mais contre-intuitif. Voici quelques expériences que vous pouvez exécuter pour vous repérer.

# bytes are stored in the order that they are printed 
$ perl -e 'print "\x{01}\x{02}\x{03}\x{04}"' | od -c 
0000000 001 002 003 004 
0000004 

# perl reads the bytes in the correct order  
$ perl -e 'print "\x{01}\x{02}\x{03}\x{04}"' | perl -ne 'print map{ord,$"}split//' 
1 2 3 4 

# but the way hexdump displays the bytes is confusing (od -h gives same output) 
$ perl -e 'print "\x{01}\x{02}\x{03}\x{04}"' | hexdump 
0000000 0201 0403 
0000004 
+0

La mise en hexadécimal conduit à '01 02 03 04'. C'est la version de [esr] (http://catb.org/esr/software.html), et aussi en général supérieure à 'hexdump' de util-linux ou' xxd'. – daxim

+0

OK, Perl va bien. La solution consiste à ajouter "-C" à Hexdump: "hexdump -C [NomFichier]" affichera les résultats attendus. – YoDar