CodeKitHub
Γιατί η μετατροπή binary-σε-κείμενο βγάζει λάθος χαρακτήρες

Γιατί η μετατροπή binary-σε-κείμενο βγάζει λάθος χαρακτήρες

Δημοσιεύτηκε 24 Ιουλ 2026

Μια ακολουθία από 1 και 0 φαίνεται αδιαμφισβήτητη — είναι binary, δεν υπάρχει τίποτα να ερμηνευτεί. Στην πράξη, η μετατροπή binary σε κείμενο αποτυγχάνει με ακριβώς την ίδια οικογένεια τρόπων όπως και η μετατροπή hex σε κείμενο, για τον ίδιο υποκείμενο λόγο: μια ακολουθία bits δεν είναι κείμενο μέχρι να κάνεις αρκετές υποθέσεις για το πώς θα την ομαδοποιήσεις και θα την ερμηνεύσεις, και το να κάνεις λάθος έστω και μία από αυτές τις υποθέσεις παράγει έξοδο που είναι λάθος με έναν συγκεκριμένο, διαγνώσιμο τρόπο.

Αιτία 1: λάθος ομαδοποίηση bits (7-bit έναντι 8-bit)

Το τυπικό ASCII χρειάζεται μόνο 7 bits ανά χαρακτήρα· τα περισσότερα εργαλεία binary-σε-κείμενο χρησιμοποιούν από προεπιλογή bytes των 8 bit, γιατί έτσι αποθηκεύεται στην πραγματικότητα το κείμενο σε πραγματικά συστήματα. Αν ένα binary string δημιουργήθηκε με την υπόθεση ομαδοποιήσεων 7-bit (κάποια παραδείγματα σε βιβλία και παλαιότερα συστήματα το κάνουν ακόμα αυτό) και το αποκωδικοποιήσεις ως bytes των 8-bit, κάθε μεμονωμένος χαρακτήρας βγαίνει μετατοπισμένος — το όριο ομαδοποίησης είναι λάθος από το πρώτο κιόλας bit, οπότε η αλλοίωση είναι ομοιόμορφη σε ολόκληρη την έξοδο αντί να ξεκινά καθαρή και να χειροτερεύει στη μέση.

Το σημάδι: αν κυριολεκτικά κάθε χαρακτήρας στην έξοδο είναι λάθος, όχι μόνο μερικοί, έλεγξε πρώτα την υπόθεση ομαδοποίησης bits πριν από οτιδήποτε άλλο.

Αιτία 2: ένα επιπλέον ή ένα λείπον bit μετατοπίζει όλα όσα ακολουθούν

Αυτό είναι το binary αντίστοιχο ενός μονού ψηφίου hex — ένα μεμονωμένο περιπλανώμενο 0 ή 1 (ένας επιπλέον χαρακτήρας από copy-paste, ένα ψηφίο που χάθηκε, κενό που ερμηνεύτηκε ως δεδομένο) μετατοπίζει το όριο byte για κάθε ομάδα μετά από εκείνο το σημείο. Σε αντίθεση με την αιτία 1, αυτό παράγει κείμενο που είναι σωστό μέχρι ένα σημείο και αλλοιωμένο μετά — ισχυρό σημάδι ότι το ίδιο το πλήθος bits είναι λάθος κάπου στο string, αντί να είναι λάθος το σχήμα encoding σε όλο το μήκος.

Μέτρησε πρώτα το συνολικό πλήθος bits: το μήκος του string πρέπει να είναι ακριβές πολλαπλάσιο του 8 (ή του 7, αν έχεις επιβεβαιώσει ότι αυτή είναι η ομαδοποίηση που χρησιμοποιείται). Αν δεν είναι, το επιπλέον ή λείπον bit είναι το bug, όχι ο αποκωδικοποιητής.

Αιτία 3: character encoding, ακριβώς όπως με το hex

Μόλις τα bits ομαδοποιηθούν σωστά σε bytes, πρέπει ακόμα να αποφασίσεις τι σημαίνουν αυτές οι τιμές byte ως χαρακτήρες — UTF-8, ASCII, Latin-1. Αυτό είναι πανομοιότυπο με την περίπτωση hex-σε-κείμενο: χαρακτήρες UTF-8 πολλαπλών bytes (τονισμένα γράμματα, σύμβολα, μη λατινικά αλφάβητα) που αποκωδικοποιούνται ένα byte τη φορά σαν το κάθε byte να ήταν δικός του χαρακτήρας παράγουν δύο ή τρία αλλοιωμένα σύμβολα στη θέση ενός σωστού. Αν η ομαδοποίηση bits έχει επιβεβαιωθεί σωστή (οι αιτίες 1 και 2 έχουν αποκλειστεί) και η έξοδος εξακολουθεί να είναι λάθος συγκεκριμένα γύρω από μη-ASCII χαρακτήρες, αυτή είναι σχεδόν πάντα η εναπομείνασα αιτία.

Αιτία 4: endianness, για binary που αναπαριστά αριθμούς αντί για κείμενο

Αν το binary string κωδικοποιεί μια αριθμητική τιμή αντί για δεδομένα χαρακτήρων — ένα prefix μήκους, ένα checksum, ένα ID ενσωματωμένο δίπλα σε κείμενο — η σειρά bit/byte έχει σημασία και δεν υπάρχει καθολική προεπιλογή. Το 00000001 ως μεμονωμένο byte είναι αδιαμφισβήτητο, αλλά αριθμητικές τιμές πολλαπλών bytes μπορούν να αποθηκευτούν με το πιο σημαντικό byte πρώτα ή το λιγότερο σημαντικό byte πρώτα, ανάλογα με το σύστημα που τις παρήγαγε, και η ανάγνωσή τους με λάθος υπόθεση παράγει σιωπηλά έναν διαφορετικό, εύλογα φαινόμενο λάθος αριθμό αντί για προφανές σφάλμα.

Διάγνωση με τη σειρά

  1. Έλεγξε ότι το συνολικό πλήθος bits είναι ακριβές πολλαπλάσιο της υποτιθέμενης ομαδοποίησής σου (συνήθως 8) — λάθος πλήθος σημαίνει αιτία 2, διόρθωσε την είσοδο.
  2. Αν κάθε χαρακτήρας είναι λάθος ομοιόμορφα από την αρχή, υποψιάσου το ίδιο το μέγεθος ομαδοποίησης (αιτία 1) πριν αγγίξεις το encoding.
  3. Αν η έξοδος είναι καθαρή στην αρχή και χειροτερεύει στη μέση, αυτό εντοπίζει ένα περιπλανώμενο/λείπον bit σε εκείνη τη θέση (αιτία 2), όχι πρόβλημα encoding.
  4. Αν ομαδοποίηση και πλήθος bits επιβεβαιώνονται σωστά και μόνο οι μη-ASCII χαρακτήρες φαίνονται λάθος, πρόκειται για character encoding (αιτία 3).
  5. Αν τα δεδομένα αναπαριστούν αριθμό αντί για κείμενο και η τιμή φαίνεται εύλογη αλλά λάθος, έλεγξε τη σειρά bytes (αιτία 4) πριν υποθέσεις ότι η ίδια η λογική μετατροπής είναι χαλασμένη.

Όπως και με το hex, το βήμα μετατροπής είναι τετριμμένο — το πραγματικό bug σχεδόν πάντα βρίσκεται σε μία από αυτές τις τέσσερις υποθέσεις, όχι στον κώδικα που κάνει τη μετατροπή.

← Επιστροφή στο blog