Forum: PC-Programmierung Problem unsigned char auf LPCSTR


von Max (Gast)


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
1
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:
1
 //Create Stream for Output and Open File
2
  ofstream fp_out;
3
  fp_out.open("pngdata.txt", ios::out);
4
  
5
  //Convert Array to string
6
  unsigned char *str;
7
  str = new unsigned char[size+1];
8
  for(int i = 0; i < size; i++){
9
    str[i] = bytes[i];
10
  }
11
12
    //Change Array to Unicode
13
14
  BSTR unicodestr = SysAllocStringLen(NULL, size);
15
  ::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

von Karl H. (kbuchegg)


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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Warum willst Du Bilddaten als Text interpretieren?

von Max (Gast)


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):
1
  for(j = 0; j < size; j++){
2
3
    if(j%4==0){
4
    fp_out << "0x";
5
    //printf("0x");
6
    }
7
    
8
    fp_out << setw(2) << setfill('0') << hex << unicodestr[j];
9
    //fp_out << setprecision(2) << hex << unicodestr[j];
10
11
    //New Line
12
    if((j+1)%4==0){
13
    fp_out << ";\n";
14
    //printf(";\n");
15
    }
16
  }

Danke für dei schnelle Antwort!
Gruß Max

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Max (Gast)


Lesenswert?

du meinst ich soll die Daten einfach in ANSI Code in den Header 
importieren?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Max (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.