Jump to content



Βοήθεια στο MATLAB


Thodoris21

Recommended Posts

Δημοσιεύτηκε

Λοιπόν,έχω ένα κείμενο σε binary(0 και 1) και θέλω να το μετατρέψω με κάποιο τρόπο σε χαρακτήρες.Το θέμα είναι οτι κάθε χαρακτήρας είναι 1 byte στο κείμενο.Το κείμενο συνολικά είναι 304 bits δηλαδή πρέπει να βρω 38 χαρακτήρες.Όποιος μπορεί ας βοηθήσει...

Στο 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.

Ναι αλλα αυτο δεν μπορω να το κανω για 304 bits(38 χαρακτηρες).Πρεπει να φτιαξω καποιο κωδικα οπου θα τα χωριζει σε 8αδες και μετα θα χρησιμοποιει την παραπανω συναρτηση.Καμια βοηθεια σε αυτο?

Είναι συνεχόμενα ή έχουν κενά μεταξύ τους; Είναι όλα σε μια σειρά;

Btw υπάρχει και η συνάρτηση load με την οποία μπορείς να φορτώσεις δεδομένα.

Αν κατάλαβα καλά έχεις μια μεταβλητή της μορφής a = 011011001001....

Αυτό αν το μετατρέψεις σε string με " στην αρχή και στο τέλος (αν δεν είναι ήδη) μπορείς με δύο εμφωλευμένα for - loops να τα εκχωρείς σε έναν πίνακα (ανα 8-αδες) και μετά να κάνεις την μετατροπή σε χαρακτήρα. (η μπορείς την ίδια στιγμή που βρίσκεις τα strings των 8 ψηφίων να κάνεις την μετατροπή χωρίς να τα βάλεις σε κάποιο πίνακα).

Καλησπέρα,

γενικά πρέπει να αποφεύγεις όσο μπορείς τα 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 γραμμές και σε κάθε γραμμή έχει και ένα χαρακτήρα.

Αν κατάλαβα καλά έχεις μια μεταβλητή της μορφής a = 011011001001....

Αυτό αν το μετατρέψεις σε string με " στην αρχή και στο τέλος (αν δεν είναι ήδη) μπορείς με δύο εμφωλευμένα for - loops να τα εκχωρείς σε έναν πίνακα (ανα 8-αδες) και μετά να κάνεις την μετατροπή σε χαρακτήρα. (η μπορείς την ίδια στιγμή που βρίσκεις τα strings των 8 ψηφίων να κάνεις την μετατροπή χωρίς να τα βάλεις σε κάποιο πίνακα).

Μπορεις να προτεινεις μια λυση με for loop οπου θα εκχωρω σε εναν πινακα το binary ανα 8αδες?

Καλησπέρα,

γενικά πρέπει να αποφεύγεις όσο μπορείς τα 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 ==> fscanf

Invalid file identifier. Use fopen to generate a valid file identifier.

Μπορεις να προτεινεις μια λυση με 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, οπότε αν δεν έχεις τα δεδομένα σε αυτό το αρχείο δε θα βρεί να διαβάσει.

Χρησιμοποιώντας αυτό


for i=1:8:304
temp = "";
for j=i:(i+7)
temp = [temp a(j)];
end;
char(bin2dec(temp))
end

παίρνω τους χαρακτήρες λίγο χύμα.Πως μπορώ να τους αποθηκεύσω σαν συμβολοσειρά όλους με τη σειρά σε μια μεταβλητή.Προσπάθησα αλλά μου εμφανίζει μόνο τον τελευταίο χαρακτήρα.

Χρησιμοποιώντας αυτό


for i=1:8:304
temp = "";
for j=i:(i+7)
temp = [temp a(j)];
end;
char(bin2dec(temp))
end

παίρνω τους χαρακτήρες λίγο χύμα.Πως μπορώ να τους αποθηκεύσω σαν συμβολοσειρά όλους με τη σειρά σε μια μεταβλητή.Προσπάθησα αλλά μου εμφανίζει μόνο τον τελευταίο χαρακτήρα.

Τρέξε όπως βλέπεις το διορθωμένο for-loop, θα σου βγάλει σε μια γραμμή τους 38 χαρακτήρες.

Αν και σου ξαναλέω ότι αυτό με το reshape θα παίξει χωρίς προβλήματα.

Στο διορθωμενο λειπει στο τελος

char(bin2dec(characters))'

Σωστα?Γιατι ετσι οπως το εχεις απλα τους χωριζει σε 8αδες.

Αν και το κειμενο μου δεν βγαζει καποιο νοημα σας ευχαριστω πολυ για την βοηθεια σας...

Ετσι απο περιεργεια αν το binary κειμενο ειναι 0000010101001101011001101000100001110010111010101001011110111111110111011000001001110110110000010001011101010111110011010001111000001100100111100010010011001011010000100100011011001010000010110100111110011100010010101011101000000111101010011110111011001011111011111010101001101111001111011000100001001010

Τι χαρακτηρες βγαζετε?Εγω βγαζω αυτο

post-5756-1416075676,8287_thumb.png

Ετσι απο περιεργεια αν το binary κειμενο ειναι
0000010101001101011001101000100001110010111010101001011110111111110111011000001001110110110000010001011101010111110011010001111000001100100111100010010011001011010000100100011011001010000010110100111110011100010010101011101000000111101010011110111011001011111011111010101001101111001111011000100001001010 

Τι χαρακτηρες βγαζετε?Εγω βγαζω αυτο

Κάτι παρόμοιο βγάζω κι εγώ. (Και με τους δύο τρόπους βγαίνει το ίδιο)

Τελικα βρηκα τον γριφο που εψαχνα...Ο γριφος ειναι

GRAMMA(TEIA)-KEIMENO-KAISARAS-KLEIDI-4

Τωρα πρεπει να σπασω αυτον τον γριφο! :confused::confused::confused::help::help::help:

Μάλλον αναφέρεται στον αλγόριθμο αποκρυπτογράφησης του Καίσαρα με κλειδί 4...Όποιος μπορεί να βοηθήσει...:help:

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.