Thodoris21 Δημοσιεύτηκε Δεκέμβριος 10, 2011 #1 Κοινοποίηση Δημοσιεύτηκε Δεκέμβριος 10, 2011 Λοιπόν,έχω ένα κείμενο σε binary(0 και 1) και θέλω να το μετατρέψω με κάποιο τρόπο σε χαρακτήρες.Το θέμα είναι οτι κάθε χαρακτήρας είναι 1 byte στο κείμενο.Το κείμενο συνολικά είναι 304 bits δηλαδή πρέπει να βρω 38 χαρακτήρες.Όποιος μπορεί ας βοηθήσει... Link to comment Share on other sites More sharing options...
papajim Δεκέμβριος 10, 2011 #2 Κοινοποίηση Δεκέμβριος 10, 2011 Στο octave, την free έκδοση του Matlab μπορείς να βάλεις char(bin2dec("binary")) και σου δίνει τον χαρακτήρα.πχ. char(bin2dec("01000010")) = ΒΕπίσης μπορείς να δημιουργήσεις έναν πίνακα με τα στοιχεία από το κείμενο κάπως έτσι a = ['0' '1' '0' '0' '0' '0' '1' '0'; '0' '1' '0' '0' '0' '0' '1' '0'];και το πετάξεις μέσα στο παραπάνω σύνολο συναρτήσεων characters = char(bin2dec(a)); θα σου δημιουργήσει ένα νέο πίνακα με τα γράμματα ο οποίος θα είναι ο characters = ['B'; 'B']Τα παραπάνω κατά 90% ισχύουν και στο Matlab. Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 10, 2011 Author #3 Κοινοποίηση Δεκέμβριος 10, 2011 Ναι αλλα αυτο δεν μπορω να το κανω για 304 bits(38 χαρακτηρες).Πρεπει να φτιαξω καποιο κωδικα οπου θα τα χωριζει σε 8αδες και μετα θα χρησιμοποιει την παραπανω συναρτηση.Καμια βοηθεια σε αυτο? Link to comment Share on other sites More sharing options...
papajim Δεκέμβριος 10, 2011 #4 Κοινοποίηση Δεκέμβριος 10, 2011 Είναι συνεχόμενα ή έχουν κενά μεταξύ τους; Είναι όλα σε μια σειρά;Btw υπάρχει και η συνάρτηση load με την οποία μπορείς να φορτώσεις δεδομένα. Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 10, 2011 Author #5 Κοινοποίηση Δεκέμβριος 10, 2011 Ειναι συνεχομενα και ειναι αποθηκευμενα σε μια μεταβλητη... Link to comment Share on other sites More sharing options...
papajim Δεκέμβριος 11, 2011 #6 Κοινοποίηση Δεκέμβριος 11, 2011 Αν κατάλαβα καλά έχεις μια μεταβλητή της μορφής a = 011011001001....Αυτό αν το μετατρέψεις σε string με " στην αρχή και στο τέλος (αν δεν είναι ήδη) μπορείς με δύο εμφωλευμένα for - loops να τα εκχωρείς σε έναν πίνακα (ανα 8-αδες) και μετά να κάνεις την μετατροπή σε χαρακτήρα. (η μπορείς την ίδια στιγμή που βρίσκεις τα strings των 8 ψηφίων να κάνεις την μετατροπή χωρίς να τα βάλεις σε κάποιο πίνακα). Link to comment Share on other sites More sharing options...
backgman Δεκέμβριος 11, 2011 #7 Κοινοποίηση Δεκέμβριος 11, 2011 Καλησπέρα,γενικά πρέπει να αποφεύγεις όσο μπορείς τα for-loops στο matlab γιατί είναι πολύ αργά.Αν έχεις διαβάσει σε μια μεταβλητή όλο το αρχείο τότε η συγκεκριμένη μεταβλητή είναι ένας πίνακας με1 γραμμή και 304 κολώνες. Μπορείς να αλλάξεις τις διαστάσεις του πίνακα με την εντολή reshape και να τον βάλεις είσοδο στην bin2dec :fid=fopen('file.dat','r');in=fscanf(fid,'%s');fclose(fid);tmp=reshape(in,8,38)';out=char(bin2dec(tmp));Κάνεις reshape σε ένα πίνακα με 8 γραμμές και 38 κολώνες αλλα η bin2dec διαβάζει γραμμές απο τον πίνακαεισόδου, οπότε στον πίνακα tmp αποθηκεύεις τον ανάστροφο (') πίνακα (38 γραμμές και 8 κολώνες).Ο πίνακας out έχει 38 γραμμές και σε κάθε γραμμή έχει και ένα χαρακτήρα. Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #8 Κοινοποίηση Δεκέμβριος 11, 2011 Αν κατάλαβα καλά έχεις μια μεταβλητή της μορφής a = 011011001001....Αυτό αν το μετατρέψεις σε string με " στην αρχή και στο τέλος (αν δεν είναι ήδη) μπορείς με δύο εμφωλευμένα for - loops να τα εκχωρείς σε έναν πίνακα (ανα 8-αδες) και μετά να κάνεις την μετατροπή σε χαρακτήρα. (η μπορείς την ίδια στιγμή που βρίσκεις τα strings των 8 ψηφίων να κάνεις την μετατροπή χωρίς να τα βάλεις σε κάποιο πίνακα).Μπορεις να προτεινεις μια λυση με for loop οπου θα εκχωρω σε εναν πινακα το binary ανα 8αδες? Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #9 Κοινοποίηση Δεκέμβριος 11, 2011 Καλησπέρα,γενικά πρέπει να αποφεύγεις όσο μπορείς τα for-loops στο matlab γιατί είναι πολύ αργά.Αν έχεις διαβάσει σε μια μεταβλητή όλο το αρχείο τότε η συγκεκριμένη μεταβλητή είναι ένας πίνακας με1 γραμμή και 304 κολώνες. Μπορείς να αλλάξεις τις διαστάσεις του πίνακα με την εντολή reshape και να τον βάλεις είσοδο στην bin2dec :fid=fopen('file.dat','r');in=fscanf(fid,'%s');fclose(fid);tmp=reshape(in,8,38)';out=char(bin2dec(tmp));Κάνεις reshape σε ένα πίνακα με 8 γραμμές και 38 κολώνες αλλα η bin2dec διαβάζει γραμμές απο τον πίνακαεισόδου, οπότε στον πίνακα tmp αποθηκεύεις τον ανάστροφο (') πίνακα (38 γραμμές και 8 κολώνες).Ο πίνακας out έχει 38 γραμμές και σε κάθε γραμμή έχει και ένα χαρακτήρα.Αυτο χτυπαει στο in=fscanf(fid,'%s');??? Error using ==> fscanfInvalid file identifier. Use fopen to generate a valid file identifier. Link to comment Share on other sites More sharing options...
papajim Δεκέμβριος 11, 2011 #10 Κοινοποίηση Δεκέμβριος 11, 2011 Μπορεις να προτεινεις μια λυση με for loop οπου θα εκχωρω σε εναν πινακα το binary ανα 8αδες?Αν και αυτό που πρότεινε το παλικάρι από πάνω είναι καλύτερο. Ένας τρόπος είναι ο εξής:characters = [];for i=1:8:304 temp = ""; for j=i:(i+7) temp = [temp a(j)]; end; characters = [characters; temp];end;characters = char(bin2dec(characters));characters'Αν έχεις ήδη βάλει σε μια μεταβλητή a το string με τα ψηφία 0 και 1.Αν γράψεις αυτόν τον κώδικα με το reshape θα παίξει μια χαρά (λογικά):a = "011001001...";temp = reshape(a, 8, 38)';out = char(bin2dec(temp));outΜε το fscanf διαβάζει τα δεδομένα από ένα αρχείο με όνομα file.dat, οπότε αν δεν έχεις τα δεδομένα σε αυτό το αρχείο δε θα βρεί να διαβάσει. Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #11 Κοινοποίηση Δεκέμβριος 11, 2011 Χρησιμοποιώντας αυτόfor i=1:8:304 temp = ""; for j=i:(i+7) temp = [temp a(j)]; end; char(bin2dec(temp))endπαίρνω τους χαρακτήρες λίγο χύμα.Πως μπορώ να τους αποθηκεύσω σαν συμβολοσειρά όλους με τη σειρά σε μια μεταβλητή.Προσπάθησα αλλά μου εμφανίζει μόνο τον τελευταίο χαρακτήρα. Link to comment Share on other sites More sharing options...
papajim Δεκέμβριος 11, 2011 #12 Κοινοποίηση Δεκέμβριος 11, 2011 Χρησιμοποιώντας αυτόfor i=1:8:304 temp = ""; for j=i:(i+7) temp = [temp a(j)]; end; char(bin2dec(temp))endπαίρνω τους χαρακτήρες λίγο χύμα.Πως μπορώ να τους αποθηκεύσω σαν συμβολοσειρά όλους με τη σειρά σε μια μεταβλητή.Προσπάθησα αλλά μου εμφανίζει μόνο τον τελευταίο χαρακτήρα.Τρέξε όπως βλέπεις το διορθωμένο for-loop, θα σου βγάλει σε μια γραμμή τους 38 χαρακτήρες.Αν και σου ξαναλέω ότι αυτό με το reshape θα παίξει χωρίς προβλήματα. Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #13 Κοινοποίηση Δεκέμβριος 11, 2011 Στο διορθωμενο λειπει στο τελοςchar(bin2dec(characters))'Σωστα?Γιατι ετσι οπως το εχεις απλα τους χωριζει σε 8αδες. Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #14 Κοινοποίηση Δεκέμβριος 11, 2011 Αν και το κειμενο μου δεν βγαζει καποιο νοημα σας ευχαριστω πολυ για την βοηθεια σας... Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #15 Κοινοποίηση Δεκέμβριος 11, 2011 Ετσι απο περιεργεια αν το binary κειμενο ειναι 0000010101001101011001101000100001110010111010101001011110111111110111011000001001110110110000010001011101010111110011010001111000001100100111100010010011001011010000100100011011001010000010110100111110011100010010101011101000000111101010011110111011001011111011111010101001101111001111011000100001001010 Τι χαρακτηρες βγαζετε?Εγω βγαζω αυτο Link to comment Share on other sites More sharing options...
papajim Δεκέμβριος 11, 2011 #16 Κοινοποίηση Δεκέμβριος 11, 2011 Ετσι απο περιεργεια αν το binary κειμενο ειναι 0000010101001101011001101000100001110010111010101001011110111111110111011000001001110110110000010001011101010111110011010001111000001100100111100010010011001011010000100100011011001010000010110100111110011100010010101011101000000111101010011110111011001011111011111010101001101111001111011000100001001010 Τι χαρακτηρες βγαζετε?Εγω βγαζω αυτοΚάτι παρόμοιο βγάζω κι εγώ. (Και με τους δύο τρόπους βγαίνει το ίδιο) Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #17 Κοινοποίηση Δεκέμβριος 11, 2011 Αυτο υποτιθεται οτι ειναι ενας γριφος και πρεπει να καταλαβω τι λεει... Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #18 Κοινοποίηση Δεκέμβριος 11, 2011 Ξερει καποιος απο επεξεργασια εικονας και στεγανογραφια?Λεω τωρα... Link to comment Share on other sites More sharing options...
papajim Δεκέμβριος 11, 2011 #19 Κοινοποίηση Δεκέμβριος 11, 2011 Δε ξέρω αν θα σε βοηθήσει να το καταλάβεις αλλά εγώ παίρνω αυτό σαν output. Good luck !!! Link to comment Share on other sites More sharing options...
Thodoris21 Δεκέμβριος 11, 2011 Author #20 Κοινοποίηση Δεκέμβριος 11, 2011 Τελικα βρηκα τον γριφο που εψαχνα...Ο γριφος ειναι GRAMMA(TEIA)-KEIMENO-KAISARAS-KLEIDI-4 Τωρα πρεπει να σπασω αυτον τον γριφο! :confused::help: Μάλλον αναφέρεται στον αλγόριθμο αποκρυπτογράφησης του Καίσαρα με κλειδί 4...Όποιος μπορεί να βοηθήσει... Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.