Jump to content



Βοήθεια στο MATLAB


Thodoris21

Recommended Posts

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

Καλησπέρα,

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

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

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

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

Link to comment
Share on other sites

Καλησπέρα,

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

Link to comment
Share on other sites

Μπορεις να προτεινεις μια λυση με 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

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


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

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


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

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

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

post-5756-1416075676,8287_thumb.png

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

Archived

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

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

Important Information

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