Problem unsigned char auf LPCSTR

Gast #1979999
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
#1980014
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?
Gast #1980063
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren