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-String zu Jpeg

 

nils.langfeld
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2012, 22:40     Titel: HEX-String zu Jpeg
  Antworten mit Zitat      
Guten Abend liebe Forum-Gemeinschaft,

bisher habe ich allein durch stöbern im Forum die meisten Lösungen meiner Probleme gefunden. Doch nun ist der Zeitpunkt gekommen, meine erste Frage zu posten.

Ich kommunizieren mit meinem Gerät über einen Serial Port. Dieser empfängt Strings und antwortet auch in dieser Form.
Nun möchte ich von meinem Gerät eine Bilddatei (JPEG) runterladen, was soweit auch scheinbar funktioniert. Als Antwort bekomme ich vom Gerät nun einen String zurück, welcher eine Reihe Hexadezimalwerte enthält.

Bei der näheren Betrachtung des gewonnen Datensatzes, wird klar (dank Wikipedia -> JPEG) dass die Struktur korrekt ist. Mein Datensatz beginnt also mit dem obligatorischen 'FF D8' und endet mit 'FF D9'. Demnach liegt mein Bild in korrekter Art und Weise vor.

Mein Problem ist nun, dass ich es einfach nicht schaffe, aus diesem Datensatz ein Jpeg zu generieren. Mein erster Versuch belief sich darauf, dass ich die Hexadezimalwerte PAARWEISE ausglesen habe und in Charakter umgewandelt habe. Diese habe ich dann via FPRINTF in eine Datei mit der Endung *.jpg geschrieben. Die Datei sieht gut aus und hat (Gott sei Dank) auch die korrekte Größe. Leider lässt sie sich nicht öffnen.
Beim Vergleich mit der Originaldatei, fiel mir auf, dass an bestimmten Stellen Werte nicht korrekt übergeben worden sind und dadurch fehlerhafte Strukturen in der Datei vorhanden sind.

Meine Recherche (GOOGLE mal drüber nach) ergab, dass es besser wäre, direkt auf dem binären Weg die Daten zu verarbeiten und anschließend auch zu schreiben.

Ich wäre euch sehr dankbar, wenn mir jemand Starthilfe geben könnte.

MFG Nils
Private Nachricht senden Benutzer-Profile anzeigen


nils.langfeld
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 08:10     Titel:
  Antworten mit Zitat      
So hab heute schon einige Schritte in die 'hoffentlich' richtige Richtung unternommen.

Code:


Hex_string = 'ffd8'
DEC = sscanf(Hex_string,'%2x')
BIN{1}=dec2bin(DEC)

 


Durch diesen Code ergibt sich nun folgende Antwort im CommandWindow:

Code:


Hex_string = ffd8

DEC =

   255
   216

BIN =  [2x8 char]

BIN{1} =

11111111
11011000

 


Dmenach habe ich meine Hexadezimalwerte nun in Binärwerte umgewandelt. Nun versuche ich einfach mal, diese in eine Datei zu schreiben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.04.2012, 11:18     Titel:
  Antworten mit Zitat      
Hallo nils.langfeld,

DEC2BIN verwandelt die Werte in Strings, also in CHAR-Vektoren. Die CHARs haben 16 Bits pro Zeichen. Eigentlich sollte dies reichen:
Code:
Hex_string = 'ffd8'
DEC = sscanf(Hex_string,'%2x')
fid = fopen(FileName, 'w');
fwrite(fid, DEC, 'uint8');
fclose(fid);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
nils.langfeld
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 11:26     Titel:
  Antworten mit Zitat      
Hab es selber gelöst. Trotzdem Danke.

Für alle die den Lösungsweg verfolgen möchten. Hier mein Code.

Code:


% Als Ausgangspunkt dient eine Hexadezimal-Zeichenkette mit einer Gesamtlänge von 15304 Zeichen.

%% HEX -> DEC %%%%%%%%%%%%%%%%%%%%%%

% Die nun erzeugte Zeichekette wird in diesem Schritt paarweise ausglesen
% und in Dezimalwerte umgewandelt, um sie im nächsten Schritt in Binärwerte
% zu verwandeln. Am Ende dieses Schrittes liegen die Dazimalwerte in der
% Variable DEC vor.

DEC = sscanf(HEX,'%2X');

% Um diesen Programmcode nicht komplett als BlackBox laufen zu lassen, wird
% an dieser Stelle kurz dargestellt, welche Ergebnisse an dieser Stelle
% vorliegen.

HEX(1:6)

DEC(1:3)

%% DEC -> BIN %%%%%%%%%%%%%%%%%%%%%%%

% Wie zuvor erwähnt, werden die Dezimalwerte in diesem Schritt in
% Binärwerte mit der Funktion DEC2BIN umgeformt.

BIN{1}=dec2bin(DEC);


% Die Besonderheit, die einem geübten Matlab-Nutzer auffällt, ist dass die
% Variable BIN in einem CellArray vorliegt. Der Grund hierfür liegt darin,
% dass die erzeugten Binärwerte in Form einer Zeichenkette erzeugt wurden.


%% Erzeugung der Ausgabedatei  %%%%%%%%%%%%%%%%%%

% Dieser Schritt dient der Vorbereitung der Ausgabedatei. Hierfür benötigt
% man einen Dateinamen und die gewünschte Berechtigung (in unserem Fall
% Schreib-Berechtigung). Für das Schreiben von binären Daten wird die Berechtigung auf 'wb' (write binary) gesetzt.
% Aus diesen beiden Angabe lässt sich dann eine sogenannte FileID mittels FOPEN() generieren.

AusgabeDateiname = 'outDEC.jpg';
Berechtigung = 'wb';

fileID = fopen(AusgabeDateiname,Berechtigung);

%% Schreiben des Datensatzes  %%%%%%%%%%%%%%%%

% Dieser Schritt ist wohl einer der wichtigsten in diesem Programm. Der erzeugte Datensatz DEC soll hier in die vorbereitete Datei
% geschrieben werden. Hierfür kommt die Funktion FWRITE() zum Einsatz.

fwrite(fileID,DEC);

% Am Ende dieses Schrittes wird die Datei geschlossen und die fileID
% verworfen.

fclose(fileID);


%% Darstellung der Datei %%%%%%%%%%%%%%%%%%

% Zum Schluss soll die Datei dargestellt werden, um dem Nutzer eine
% visuelle Interpretation des Ergebnis zu ermöglichen. Hierfür wird als
% erstes das erzeugte Bild eingeladen und anschließend mit der Funktion
% IMSHOW() dargestellt.

BILD = imread(AusgabeDateiname);
imshow(BILD)


%% CommandWindowAusgabe %%%%%%%%%%%%%%%%%%

% Diese Ausgabe dient dazu, die erfolgrich abgeschlossene Aktion im
% CommandWindow zu bestätigen, sodass der Nutzer eine Information erhält,
% dass der Programmcode durchgelaufen ist.

c=clock;

fprintf('\n --- Aktion erfolgt um %02.0f:%02.0f ---\n',c(4),c(5));

 
Private Nachricht senden Benutzer-Profile anzeigen
 
nils.langfeld
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.04.2012, 11:28     Titel:
  Antworten mit Zitat      
Hallo Jan, sorry hab deine Antwrot erst jetzt gelesen. Danke für die Hilfe dein CodeSnippet ist ein kürzere Variante von meinem. Aber ebenso wirkungsvoll!
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.