Δείτε εδώ τα πιο πρόσφατα μηνύματα από όλες τις περιοχές συζητήσεων, καθώς και όλες τις υπηρεσίες της AcroBase. H εγγραφή σας είναι γρήγορη και εύκολη. |
|
|
|
Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#1
|
#2
|
|
||||
Με απλά λόγια: Ένα εκτελέσιμο πρόγραμμα αποτελείται από bytes που λαμβάνουν τιμές μεταξύ 0 και 255, δηλαδή γεμίζουν και τα 8 bits. Το κείμενο που διαβάζουμε αποτελείται από bytes που λαμβάνουν τιμές μεταξύ 32 και 127, δηλαδή γεμίζουν 7 bits. Άρα οποιοσδήποτε αλγόριθμος μπορεί να αντιστοιχήσει μονοσήμαντα τα 8 bits της εισόδου στα 7 bits της εξόδου, κάνει τη δουλειά που θες Πχ ένας χαζός αλγόριθμος μπορεί να είναι: 1. Διάβασε 7 bytes εισόδου 2. Γράψε τα 7 least significant bits σε 7 χαρακτήρες κειμένου (εξόδου) 3. Σύνθεσε τα 7 most significant bits από το κάθε byte εισόδου σε ένα χαρακτήρα κειμένου (εξόδου) Για την αντίστροφη διαδικασία διαβάζεις 8 χαρακτήρες κειμένου και συνθέτεις 7 bytes.
__________________
may you live in interesting times |
#3
|
|
||||
Ακούγεται όντως σαν uuencoded αρχείο. Τα πιο κοινά τέτοια formats είναι το uuencode, και το base64. Και τα δύο εφευρέθηκαν για να επιτρέπουν τη μεταβίβαση 8-bit υλικού (binary, ελληνικά, κλπ κλπ) μέσω συστημάτων που επέτρεπαν μόνο 7-bit υλικό (συνήθως us-ascii).
Αν βρεις κάτι σαν «begin 666 filename.zip» πριν από το block των χαρακτήρων, και οι περισσότερες γραμμές ξεκινούν με «M», τότε είναι uuencoded. Αν το block χαρακτήρων έχει και μικρά και κεφαλαία λατινικά γράμματα, είναι base64. Το uuencode (unix-to-unix encode) είναι της εποχής του UUCP (Unix-to-Unix CoPy), του πρώτου τρόπου μετάδοσης email, news κλπ μεταξύ σταθμών στο ARPAnet. Ναι, είναι τόσο παλιό. Το base64 είναι νεώτερο, και χρησιμοποιείται κυρίως σε email. Το uuencode έχει ξεκάθαρη αρχή και τέλος, οπότε συνήθως απλά έβαζες ένα uuencoded αρχείο χύμα μέσα σε email (δε χρειάζονταν επισυνάψεις). Το πρόγραμμα uudecode δε μπερδευόταν καθόλου από το άσχετο κείμενο. Αυτό δεν ισχύει στο base64, όμως. Επίσης δεν είναι συμπίεση, αλλά φούσκωμα! Ο λόγος είναι προφανής: δεδομένα σε ποσότητες των 8 bits (octets) πρέπει να χωρέσουν σε ποσότητες των 7 (7-bit bytes). Το κόλπο είναι να θεωρήσεις ότι αυτές οι ποσότητες είναι strings από bits, όχι από bytes, και να ανακωδικοποιήσεις το string σε bytes. Πχ, το octet string «Gildor!» είναι ως εξής σε δυαδικό σύστημα: Κώδικας:
01000111 01101001 01101100 01100100 01101111 01110010 00100001 Κώδικας:
01000111011010010110110001100100011011110111001000100001 Κώδικας:
0100011 1011010 0101101 1000110 0100011 0111101 1100100 0100001 Αυτό είναι η θεωρία. Στην πράξη, δε μπορούμε να χρησιμοποιήσουμε 7 bits. Το 7-bit ASCII περιλαμβάνει ένα κάρο χαρακτήρες που δεν περνάνε «καθαρά» από όλα τα συστήματα. Οι χαρακτήρες 0–31 είναι ειδικοί και συνήθως δεν εμφανίζονται καν, και το ίδιο συμβαίνει με τον χαρακτήρα 127. Επίσης, θέλουμε (προφανώς) ακέραιο αριθμό bits, δηλαδή δύναμη του 2. Έχουμε 95 χαρακτήρες στη διάθεσή μας (ASCII 32–126), και η καλύτερη δύναμη του δύο που έχουμε είναι η 6η: 2^6 = 64 χαρακτήρες. Έτσι επιλέγουμε να κωδικοποιήσουμε octets σε 6-bit bytes. Αυτό μας δίνει ένα θεωρητικό φούσκωμα 133% (3 octets γίνονται 4 6-bit bytes). Το uuencode χρησιμοποιεί ένα πίνακα που αντιστοιχεί τους 64 χαρακήρες [κενό] και «!"#$%&'()*+,-.0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]» στις τιμές 0–63 (000000–111111), και αυτός ο πίνακας είναι η βάση της κωδικοποίησης. Προγραμματιστικά, η τεχνική είναι σχετικά απλή: διαβάζεις 3 octets, και τις αντιστοιχείς με bit operations σε 4 6-bit bytes. Εξάγεις τις τιμές με τη βοήθεια του πίνακα αντιστοιχίας, διαβάζεις τα επόμενα 6 octets, και ούτω καθ'εξής. Αν το αρχείο δεν έχει μέγεθος (σε octets) πολλαπλάσιο του 3, συμπληρώνεις με όσα μηδενικά χρειάζεσαι. Έστω ότι τα octets σου τα ορίζεις ως octets[3] στη C, και τα 6-bit bytes ως bytes6[4], κάνεις αυτό: Κώδικας:
octets: 010001110110100101101100 bytes: 010001110110100101101100 Κώδικας:
bytes6[0] = (octets[0] >> 2) & 077; bytes6[1] = (octets[0] & 003) | (octets[1] >> 4) & 077; bytes6[2] = (octets[1] & 007) | (octets[2] >> 6) & 077; bytes6[3] = (octets[2] & 077) | 077;
__________________
www.bedroomlan.org |
#4
|
|
||||
Επί τη ευκαιρία, αν χρησιμοποιείς Python, μπορείς να κωδικοποιήσεις οποιοδήποτε string σε uuencode ή base64, γράφοντας κάτι τέτοιο:
print some_string.encode('uu') ή print some_string.encode('base64') Υπάρχουν επίσης και οι προφανείς αντίστοιχες .decode('uu') και .decode('base64') methods που αποκωδικοποιούν strings που περιέχουν uuencoded/base64encoded δεδομένα. Σε POSIX περιβάλλον, οι εντολές uuencode και uudecode κάνουν το προφανές. Με την παράμετρο -m (ή --base64) (απο)κωδικοποιούν base64. Στο Linux υπάρχει και αυτούσια εντολή base64.
__________________
www.bedroomlan.org |
#5
|
|
||||
Που με ταξιδεύετε τώρα ... που έστελνα πακέτα με qwk της acro, σε μερικά φοιητάκια στο μεγάλο νησί
__________________
όταν γράφεται η ιστορία της ζωής σου, μην αφήνεις κανέναν να κρατάει την πένα |
#6
|
|
||||
Κι εγώ νόμιζα ότι θα έλεγες πως κατέβαζες uuencoded τσόντες από το Usenet.
__________________
www.bedroomlan.org |
#7
|
|
||||
Οντως ειναι uuencode
begin 664 binwarez.zip Πολυ steampunk φαση ακουγεται
__________________
Υπάρχουν σε όλα δύο απόψεις... Αυτή που λέω εγώ, και η σωστή! Τελευταία επεξεργασία από το χρήστη Gildor : 04-02-10 στις 20:38 |
#8
|
|
||||
Κι όμως, υπάρχουν πολλοί δεινόσαυροι στο internet που κάνουν τέτοιες κωδικοποιήσεις απαραίτητες. Άλλωστε ακόμα και σήμερα, η πλειονότητα των email έχει επισυνάψεις σε base64, οπότε όλοι οι MTA υποθέτουν ότι όλο και κάποιος server θα είναι 7-bit.
...και φαντάσου ότι δε μπήκαμε καν στο ζήτημα του EBCDIC. Εκεί να δεις steampunk, ψυχολογικά θρίλερ και βαρύ σαδομαζοχισμό.
__________________
www.bedroomlan.org |
#9
|
|
||||
Αν μπεις στην παλιά AcroBase, εκεί κατεβάζω ακόμα με uuencode
__________________
όταν γράφεται η ιστορία της ζωής σου, μην αφήνεις κανέναν να κρατάει την πένα |
#10
|
|
|||
...θυμάμαι minicom που είχε μία hacked έκδοση που υποστήριζε telnet [1] και έκανα copy-paste το uuencoded acro.rep, μόλις είχα αρχίσει να παίζω με linux.
Δ. [1] ή το υποστήριζε έτσι κι αλλιώς, δεν θυμάμαι
__________________
Let's call it an accidental feature -- Larry Wall |
Συνδεδεμένοι χρήστες που διαβάζουν αυτό το θέμα: 1 (0 μέλη και 1 επισκέπτες) | |
|
|