Βαθμωτά και συμβολοσειρές · Αριθμητικές συναρτήσεις
hex#
Ερμηνεύει μια συμβολοσειρά ως δεκαεξαδικό αριθμό και επιστρέφει την αριθμητική της τιμή.
Η hex διαβάζει την EXPR ως ακολουθία δεκαεξαδικών ψηφίων - προαιρετικά με πρόθεμα 0x ή x - και επιστρέφει τον ακέραιο που αντιπροσωπεύουν τα ψηφία αυτά. Αν η EXPR παραλειφθεί, χρησιμοποιείται η $_. Η συμπληρωματική λειτουργία, μετατροπή αριθμού πίσω σε δεκαεξαδική συμβολοσειρά, είναι η sprintf με μορφή "%x" ή "%X".
Σύνοψη#
hex EXPR
hex # operates on $_
Τι επιστρέφεται#
Ένας μη αρνητικός αριθμός. Η ίδια η hex δεν επιστρέφει ποτέ αρνητική τιμή: δεν έχει έννοια πρόσημου, αποκωδικοποιεί μόνο ψηφία.
Αν το αποτέλεσμα χωράει σε εγγενή ακέραιο (τυπικά 64-bit μη προσημασμένο σε 64-bit build), παίρνετε ακέραιο.
Αν η αποκωδικοποιημένη τιμή υπερβαίνει το εύρος αυτό, η
hexυποχωρεί σε IEEE 754 double. Εκπέμπεται προειδοποίηση υπόuse warningsκαι μπορεί να χαθεί ακρίβεια για τιμές πάνω από2**53.
Για μετατροπή προς την αντίθετη κατεύθυνση:
sprintf "%x", 255 # "ff"
sprintf "0x%08X", 4096 # "0x00001000"
Παραδείγματα#
Σκέτα δεκαεξαδικά ψηφία, με ή χωρίς το πρόθεμα 0x:
print hex '0xff'; # 255
print hex 'ff'; # 255
print hex 'DEADBEEF'; # 3735928559
Επιτρέπονται κάτω παύλες ανάμεσα σε ψηφία ως οπτικοί διαχωριστές, όπως ακριβώς τις δέχονται και τα αριθμητικά κυριολεκτικά:
print hex '1_0000'; # 65536
print hex 'cafe_f00d'; # 3405700109
Δράση επί της $_:
for ('10', '20', 'ff') {
print hex, "\n"; # 16, 32, 255
}
Πλήρης γύρος μιας τιμής μέσω hex:
my $n = 0xC0FFEE;
my $s = sprintf "%x", $n; # "c0ffee"
print hex $s; # 12648430
Τιμές που υπερχειλίζουν το πλάτος εγγενούς ακέραιου προειδοποιούν και επιστρέφουν float:
use warnings;
my $big = hex 'ffffffffffffffffff'; # 19 'f's - too wide for u64
# "Integer overflow in hexadecimal number" warning
# $big is now an IEEE 754 double, with lost precision
Οριακές περιπτώσεις#
Μη δεκαεξαδικοί χαρακτήρες τερματίζουν την ανάλυση. Ο πρώτος χαρακτήρας που δεν είναι δεκαεξαδικό ψηφίο, κάτω παύλα ή αναγνωρισμένο πρόθεμα τερματίζει τη σάρωση. Υπό
use warningsαυτό εκπέμπειIllegal hexadecimal digit '…' ignored:use warnings; print hex '1f garbage'; # 31, with a warning print hex '0xAZ'; # 10, with a warning on 'Z'
Τα προπορευόμενα κενά δεν παραλείπονται. Σε αντίθεση με την
oct, ηhexαντιμετωπίζει τα κενά ως μη δεκαεξαδικό χαρακτήρα, οπότε ένα προπορευόμενο κενό σταματά την ανάλυση πριν εμφανιστεί οποιοδήποτε ψηφίο:print hex ' ff'; # 0
Η κενή συμβολοσειρά και η
undefεπιστρέφουν0. Μια κενήEXPRδίνει0χωρίς προειδοποίηση. Μια σκέτηundefδίνει0και εκπέμπει τη συνήθη προειδοποίησηUse of uninitialized valueυπόuse warnings.Καμία διαχείριση πρόσημου. Ένα προπορευόμενο
-ή+είναι μη δεκαεξαδικός χαρακτήρας και τερματίζει την ανάλυση πριν από οποιοδήποτε ψηφίο, οπότε ηhex '-ff'επιστρέφει0. Για να αναλύσετε προσημασμένη δεκαεξαδική συμβολοσειρά, αφαιρέστε μόνοι σας το πρόσημο:my $s = '-ff'; my $n = ($s =~ s/^-//) ? -hex($s) : hex($s); # -255
Μορφές προθέματος. Τα αποδεκτά προθέματα είναι
0x,0X,xκαιX. Ένα σκέτο0δεν είναι πρόθεμα - είναι ψηφίο. Δεν υπάρχει πρόθεμα#ή$.Η μορφή πεζών/κεφαλαίων είναι αδιάφορη για τα ψηφία
a-fκαι για το γράμμα προθέματοςx.Τοποθέτηση κάτω παύλας. Μία μεμονωμένη κάτω παύλα μπορεί να προηγείται κάθε ψηφίου. Δύο διαδοχικές κάτω παύλες, μία προπορευόμενη κάτω παύλα πριν το πρόθεμα ή μία τελική κάτω παύλα τερματίζουν την ανάλυση ως μη δεκαεξαδικοί χαρακτήρες.
Διαφορές από το upstream#
Πλήρως συμβατό με το upstream Perl 5.42.
Δείτε επίσης#
oct- αποκωδικοποιεί συμβολοσειρές με αυτο-εντοπιζόμενη βάση:0x…ως δεκαεξαδικό,0b…ως δυαδικό,0…ως οκταδικό, οτιδήποτε άλλο ως δεκαδικό. Χρησιμοποιήστε την όταν η βάση της εισόδου δεν είναι γνωστή εκ των προτέρωνsprintf- η αντίστροφη κατεύθυνση·"%x"/"%X"μορφοποιούν έναν αριθμό σε δεκαεξαδική συμβολοσειρά με πεζά ή κεφαλαία,"%#x"προσθέτει το πρόθεμα0x,"%08x"συμπληρώνει με μηδενικά σε σταθερό πλάτοςprintf- ίδια μορφοποίηση"%x", γραμμένη απευθείας σε filehandlepack- τα πρότυπαH(υψηλό nibble πρώτο) καιh(χαμηλό nibble πρώτο) μετατρέπουν μεταξύ συμβολοσειράς δεκαεξαδικών ψηφίων και πακεταρισμένων δυαδικών bytes· χρησιμοποιήστε τα όταν μεταφέρετε δεκαεξαδικά δεδομένα από και προς ένα δυαδικό πρωτόκολλοunpack- το αντίστροφο τηςpack· με"H*"μετατρέπει μια συμβολοσειρά bytes σε συμβολοσειρά δεκαεξαδικών ψηφίων με μία κλήση