WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

hex-werte schnell(!) nach binär wandeln und spiegeln

 

matmic
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2012, 18:42     Titel: hex-werte schnell(!) nach binär wandeln und spiegeln
  Antworten mit Zitat      
Hallo Matlab-Experten.

Folgendes Problem:
Ich habe eine csv-Datei mit 10 Hex-Werten (Text), durch Leerzeichen getrennt, in jeder Zeile. Die Anzahl der Zeilen ist z.

Über textscan lese ich die Daten in ein Cell-Array.
In diesem befinden sich dann also z Cell-Arrays mit jeweils 10 Werten.
Z.B. Zeile 1: 'FA' '50' 'BB' 'C0' '01' 'FF' '00' '00' '11'

Hier muß jetzt die Bitfolge jedes Bytes gespiegelt werden. Also aus FA (1111 1010) wird 5F (0101 1111).

Die gesamte so bearbeitete Bitfolge für eine Zeile soll wieder in der ursprünglichen Zeile des Cell-Arrays abgelegt werden.

Ich hab mir jetzt so beholfen:

for a = 1: 1 : z
tempstring = '';
for b = 1 : 1 : 10
tempstring = strcat(tempstring, Invert{(1+hex2dec(cellarray{a}{b}(1)))});
end

cellarray{[a]} = tempstring;
end

wobei Invert ein Cell-Array ist, das bereits die gespiegelten Bitfolgen für jeden Hexwert in Binärdarstellung enthält:

Invert = {'00000000', '10000000', '01000000', '11000000', '00100000', '10100000', '01100000', '11100000', '00010000', '10010000', '01010000', '11010000', '00110000', '10110000', '01110000', '11110000', '00001000', '10001000', '01001000', '11001000', '00101000', '10101000', '01101000', '11101000', '00011000', '10011000', '01011000', '11011000', '00111000', '10111000', '01111000', '11111000', '00000100', '10000100', '01000100', '11000100', '00100100', '10100100', '01100100', '11100100', '00010100', '10010100', '01010100', '11010100', '00110100', '10110100', '01110100', '11110100', '00001100', '10001100', '01001100', '11001100', '00101100', '10101100', '01101100', '11101100', '00011100', '10011100', '01011100', '11011100', '00111100', '10111100', '01111100', '11111100', '00000010', '10000010', '01000010', '11000010', '00100010', '10100010', '01100010', '11100010', '00010010', '10010010', '01010010', '11010010', '00110010', '10110010', '01110010', '11110010', '00001010', '10001010', '01001010', '11001010', '00101010', '10101010', '01101010', '11101010', '00011010', '10011010', '01011010', '11011010', '00111010', '10111010', '01111010', '11111010', '00000110', '10000110', '01000110', '11000110', '00100110', '10100110', '01100110', '11100110', '00010110', '10010110', '01010110', '11010110', '00110110', '10110110', '01110110', '11110110', '00001110', '10001110', '01001110', '11001110', '00101110', '10101110', '01101110', '11101110', '00011110', '10011110', '01011110', '11011110', '00111110', '10111110', '01111110', '11111110', '00000001', '10000001', '01000001', '11000001', '00100001', '10100001', '01100001', '11100001', '00010001', '10010001', '01010001', '11010001', '00110001', '10110001', '01110001', '11110001', '00001001', '10001001', '01001001', '11001001', '00101001', '10101001', '01101001', '11101001', '00011001', '10011001', '01011001', '11011001', '00111001', '10111001', '01111001', '11111001', '00000101', '10000101', '01000101', '11000101', '00100101', '10100101', '01100101', '11100101', '00010101', '10010101', '01010101', '11010101', '00110101', '10110101', '01110101', '11110101', '00001101', '10001101', '01001101', '11001101', '00101101', '10101101', '01101101', '11101101', '00011101', '10011101', '01011101', '11011101', '00111101', '10111101', '01111101', '11111101', '00000011', '10000011', '01000011', '11000011', '00100011', '10100011', '01100011', '11100011', '00010011', '10010011', '01010011', '11010011', '00110011', '10110011', '01110011', '11110011', '00001011', '10001011', '01001011', '11001011', '00101011', '10101011', '01101011', '11101011', '00011011', '10011011', '01011011', '11011011', '00111011', '10111011', '01111011', '11111011', '00000111', '10000111', '01000111', '11000111', '00100111', '10100111', '01100111', '11100111', '00010111', '10010111', '01010111', '11010111', '00110111', '10110111', '01110111', '11110111', '00001111', '10001111', '01001111', '11001111', '00101111', '10101111', '01101111', '11101111', '00011111', '10011111', '01011111', '11011111', '00111111', '10111111', '01111111', '11111111'};


Das Ganze dauert sehr lange (Daumenwert 2 Minuten für 50000 Zeilen).

Gibt's eine schnellere Lösung?

Danke & Gruß

matmic
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2012, 21:14     Titel:
  Antworten mit Zitat      
Hallo matmic,

um die Geschwindigkeit z erhöhen, möglichst viele String- und Celloperationen vermeiden:
Zum Flippen der Binärwerte reichen eigentlich die 4bit Hexziffern 0..F.
Hier erstmal das Array zum Konvertieren:
Code:
C='';C(1:4,'0123456789ABCDEF')=fliplr(dec2bin(0:15,4))';

Als nächstes, einlesen geht am schnellsten mit fread
Code:
fid=fopen('datei');
data=fread(fid,'*uint8');
fclose(fid);
 

jetzt alle Leerzeichen entfernen und je zwei Hexziffern vertauschen (F5->5F):
Code:
data=flipud(reshape(data(data>32),2,[]));

und zum Schluß noch die Hexziffern durch Binärzeichen ersetzen und in
80 Zeichen pro Zeile umformen:
Code:
data=reshape(C(:,data(:)),80,[])';
ergebnis=cellstr(data);


Mich würde nur noch interessieren ob es jetzt 1 oder 2s dauert? Very Happy

Gruß
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
matmic
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 10.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2012, 11:22     Titel:
  Antworten mit Zitat      
Hallo Sirius!

Sirius3 hat Folgendes geschrieben:

Mich würde nur noch interessieren ob es jetzt 1 oder 2s dauert? Very Happy

Gruß
Sirius


Na, ganz so schnell sind wir nicht unterwegs. Aber 5 Sekunden gegenüber 50 Minuten für ca. 50000 Quellzeilen ist schon ein Fortschritt.
Ich bin begeistert! Vielen Dank Smile

Gruß

matmic
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.