mikrocontroller.net

Forum: PC-Programmierung Problem unsigned char auf LPCSTR


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich schreibe gerade ein C++ Tool indem ich ein PNG File einlesen und ein 
32Bit Array wandeln kann um es als Textur einbinden zu können im Projekt 
meiner Diplomarbeit... Folgendes Problem:

Ich habe die Bilddaten in einem unsigned Byte Array über die DevIL 
Library
ILubyte * bytes = ilGetData() ;
das das array unsigned is kann ich meines Erachtens nich ändern ohne im 
Headerfile rumzupfuschn...
Wichtig: Für die DevIL Lib ist bei mir der UNICODE deaktiviert! Deswegen 
hab ich natürlich jetzt wenn ich das in ein file exportier ANSI Code 
jaigitt :/
Ich hab nun das Array in einen String gepackt um diesen mit 
::MultiByteToWideChar() in UNICODE zu wandeln und dann per ofstream in 
ein File zu packen:
 //Create Stream for Output and Open File
  ofstream fp_out;
  fp_out.open("pngdata.txt", ios::out);
  
  //Convert Array to string
  unsigned char *str;
  str = new unsigned char[size+1];
  for(int i = 0; i < size; i++){
    str[i] = bytes[i];
  }

    //Change Array to Unicode

  BSTR unicodestr = SysAllocStringLen(NULL, size);
  ::MultiByteToWideChar(CP_ACP, 0, str, size, unicodestr, size);

Wenn ich es so mache krieg ich nen Error, da str unsigned char ist aber 
vom der Funktion MultiByteToWideChar() als LPCSTR erwartet wird :/
Wenn ich aber mein Byte Array auf einen signed string caste konvertiert 
er zwar aber ich bekommen falsche Werte. Das liegt vermutlich daran, 
dass ich beim casten von unsigned auf signed negative Werte bekomme, die 
dann natürlich über ANSI Tabelle konvertiert quark mit Soße sind :o)

Zum Verständnis allgemein: Im Byte Array bytes[i] befinden sich RGBA 
Werte des PNG also zB  0,0,0,255. Was ich am Ende im Textfile haben will 
ist folgende Darstellung: 0x000000ff.

Ich hoff es hat vielleicht einer nen Tipp wie ich das Problem lösen 
kann, da häng ich grad ziemlich an der Wand  :(

Grüße
Max

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Sinn soll es denn bitte haben, ein Bild, welches aus Bytes 
besteht wie einen String zu behandeln?

Dort liegt schon das Problem!
Du musst zwischen Bytes und Strings unterscheiden und die jeweils 
richtigen Funktionen dafür benutzen.
Mach um alle Funktionen, welche ein STR oder String oder etwas 
gleichwertiges im Namen haben einen großen Bogen und benutze nur 
Funktionen die deine Bytes auch als Bytes behandeln und du hast deine 
Probleme gar nicht.


> Zum Verständnis allgemein: Im Byte Array bytes[i] befinden sich
> RGBA Werte des PNG also zB  0,0,0,255. Was ich am Ende im Textfile
> haben will ist folgende Darstellung: 0x000000ff.

Willst du wirklich ein Textfile erstellen?
Soll da also der Text 0x000000ff drinnen stehen. Wenn du also das File 
mit Notepad aufmachst, dann steht da der Text "0x000000ff" so wie da 
auch "Hallo Otto" hätte stehen können?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum willst Du Bilddaten als Text interpretieren?

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

gut da muss ich wohl etwas ausholen :)

Rufus Τ. Firefly schrieb:
> Warum willst Du Bilddaten als Text interpretieren?

Ich arbeite an einem Instrument Cluster in OpenGL. Um ein PNG als Textur 
einzubinden werden die Bilddaten per 32Bit-Array in headern eingepflegt.
Ichw eiss, DevIL ermöglicht mir direkt an die Textur-Funktionen von 
OpenGL zu übergeben. Folgender Grund warum ichs gerade noch nicht tu:
Ich bin noch grün hinter den Ohren OpenGL und habe ein Beispiel Cluster 
vorliegen. Um mir den Einstieg zu erleichtern versuche ich die Struktur 
dessenbeizubehalten.

Karl heinz Buchegger schrieb:
> Willst du wirklich ein Textfile erstellen?
>
> Soll da also der Text 0x000000ff drinnen stehen. Wenn du also das File
>
> mit Notepad aufmachst, dann steht da der Text "0x000000ff" so wie da
>
> auch "Hallo Otto" hätte stehen können?

ja genau. Dann muss ich nur noch den .txt output copy-pasten in nen 
Header. Den String hab ich eigentlich nur gemacht um die Funktion 
MultiByteToWideChar() nutzen zu können.

Das schreiben ins File is kein problem das hab ich so gelöst 
(funktioniert ansich auch wies soll):
  for(j = 0; j < size; j++){

    if(j%4==0){
    fp_out << "0x";
    //printf("0x");
    }
    
    fp_out << setw(2) << setfill('0') << hex << unicodestr[j];
    //fp_out << setprecision(2) << hex << unicodestr[j];

    //New Line
    if((j+1)%4==0){
    fp_out << ";\n";
    //printf(";\n");
    }
  }

Danke für dei schnelle Antwort!
Gruß Max

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max schrieb:
> ja genau. Dann muss ich nur noch den .txt output copy-pasten in nen
> Header. Den String hab ich eigentlich nur gemacht um die Funktion
> MultiByteToWideChar() nutzen zu können.

Und warum soll eine Datei, die wenig mehr als ein Hexdump ist, 
ausgerechnet eine Unicode-Datei sein? Das bläht sie nur unnötig auf.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du meinst ich soll die Daten einfach in ANSI Code in den Header 
importieren?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn "der Header" eine C- oder C++-Headerdatei ist, dann ist das ratsam. 
Ich kenne keinen C-/C++-Compiler, der Quelltext ausgerechnet im 
Unicode-Format erwartet.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso O.o
ja der Gedanke ist mir so noch gar nich gekommen. Wirklich Leserlicher 
is der Hex Header ja nun wirklich nich... ich probiers mal aus!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.