Βαθμωτά και συμβολοσειρές · Αριθμητικές συναρτήσεις

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", γραμμένη απευθείας σε filehandle

  • pack - τα πρότυπα H (υψηλό nibble πρώτο) και h (χαμηλό nibble πρώτο) μετατρέπουν μεταξύ συμβολοσειράς δεκαεξαδικών ψηφίων και πακεταρισμένων δυαδικών bytes· χρησιμοποιήστε τα όταν μεταφέρετε δεκαεξαδικά δεδομένα από και προς ένα δυαδικό πρωτόκολλο

  • unpack - το αντίστροφο της pack· με "H*" μετατρέπει μια συμβολοσειρά bytes σε συμβολοσειρά δεκαεξαδικών ψηφίων με μία κλήση