char -> BSTR
-
Hi nochmal,
ich suche eine Möglichkeit, in einer Schleife einen BSTR mit char's zu füllen.
Code ->
BSTR bStr = NULL; char txt; ifstream ifs( of, ios::in | ios::binary ); ifs.seekg(ios::beg); _bstr_t bstr(bStr); while( ifs.get( txt ) ) { size_t alloc_len = strlen(&txt) + 1; wchar_t* wc_out = new wchar_t[alloc_len]; size_t result = mbstowcs(wc_out, &txt, alloc_len); bstr += _bstr_t(wc_out); }es geht darum, den Inhalt einer binären Datei in einen BSTR zu schieben.
Dateiinhalt: (31 '␟',139 '‹',8 '␈',0,0,0,0,0,0,11 '␋',221 'Ý',91 '[',125 '}',108 'l',20 '␔',199 'Ç',21 '␕',127 '',51 '3',123 '{',31 '␟',62 '>',251 'û',252 'ü',129 '',57 '9',167 '§',180 '´',177 '±',195 'Ã',41 ')',64 '@',2 '␂',9 '␉',4 '␄',199 'Ç',34 '"',77 'M',171 '«',136 'ˆ',10 '␊',10 '␊',54 '6',164 '¤',197 'Å',8 '␈',25 '␙',227 'ã',0,45 '-',...,...), Länge 2858
Inhalt von bstr: b = {"ÌÌÌÌÌÌÌÌ‹ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÝÌÌÌÌÌÌÌÌ[ÌÌÌÌÌÌÌÌ}ÌÌÌÌÌÌ ...usw... (1)}, Länge = 25635

Wo liegt der Fehler?
grüssle

-
Smitty schrieb:
Wo liegt der Fehler?
Grundsätzlich darin, dass du strlen auf ein einzelnes char ansetzt. Was dabei rauskommt, ist undefiniert, und hängt wohl davon ab, was im Speicher dahinter steht.
Smitty schrieb:
es geht darum, den Inhalt einer binären Datei in einen BSTR zu schieben.
Klingt unsinnig. Warum tust du das überhaupt?
-
MFK schrieb:
Smitty schrieb:
es geht darum, den Inhalt einer binären Datei in einen BSTR zu schieben.
Klingt unsinnig. Warum tust du das überhaupt?
Hast ja recht, ich seh's genauso
. Nur bin ich in diesem Fall nicht der, der die Entscheidungen trifft ...Ok, warum tue ich das?! Es geht im Grunde darum, eine mit ZLIB komprimierte Grafikdatei zwecks Umwandlung in Base64( > Ziel ist XML Datei ) in einen String zu stellen. CString is nich, da der bei der ersten 0 das Kopieren beendet.
BSTR kanns.Sollte jmd. eine bessere / performantere / einfachere / ... Lösung kennen, dann immer her damit

grüssle

-
Smitty schrieb:
Es geht im Grunde darum, eine mit ZLIB komprimierte Grafikdatei zwecks Umwandlung in Base64( > Ziel ist XML Datei ) in einen String zu stellen.
Warum ein String? Hast du eine Umwandlungsfunktion, die wirklich einen String für die Eingabedaten braucht? Die sind ja üblicherweise binär, da ist ein Stringtyp wenig sinnvoll, ein Wide-Character-String noch weniger.
Base64Encode aus der ATL will übrigens die Eingabedaten als BYTE-Zeiger.
-
Smitty schrieb:
CString is nich, da der bei der ersten 0 das Kopieren beendet.
BSTR kanns.Stimmt nicht. Das hängt davon ab wie du es machst und welche operatoren Du verwendest.
Aber weder BSTR noch ein CString sind geeignet für binäre Daten.
Wie soll den der BSTR die Daten halten ein BYTE pro wchar_t, welches ja bekanntlich 16bit hat? Oder willst Du das Binary immer WORD weise nach BSTR packen.
Wa sist wenn die Datenmenge eine ungerade Anazhl Bytes hat?Smitty schrieb:
Sollte jmd. eine bessere / performantere / einfachere / ... Lösung kennen, dann immer her damit

Nimm einen BYTE Buffer oder einen SafeArray mit BYTEs oder oder oder...
-
std::vector<byte> vContent; std::ifstream file(pcFileName, std::ios_base::binary); if(file.is_open()) std::copy(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), std::back_inserter(vContent));