Probleme mit dem Casting von char nach byte

Hallo zusammen,

ich erhalte von einer Funktion einen string zurück, der die Repräsentation eines byte arrays darstellt in Form von Unicode Zeichen. Um daraus ein echtes byte-array zu machen durchlaufe ich die einzelnen chars und caste sie auf byte. Das funktioniert eigentlich auch gut. Bis auf das Zeichen mit dem Unicode-Wert /u0136. Daraus wird ein Byte-Wert von 198. Wenn ich das char in einem Log-File darstelle, wird auch richtigerweise ein Accent circonflexe (Dachzeichen) angezeigt. Dies entspricht einem Byte-Wert von 136 (laut erweiterter ASCII-Tabelle).

Kann irgendjemand diesen Fehler nachvollziehen und mir weiterhelfen.

Vielen Dank !!!

Daniel

//— Code snippet

string response = Funktion();

for(int i=0; i

Hi Daniel!

Ehrlich gesagt ist das einfache casten von Char nach Byte nicht so ganz die feine englische Art. Bis Position 128 stimmt meines Wissens nach der Unicode-Wert mit ASCII überein, aber darüber hinaus würde ich mich nicht mehr darauf verlassen.
Spätestens wenn’s über 8bit rausgeht, ist eh’ Schluss.

Für das Konvertieren von/nach byte-Arrays mit unterschiedlichen Encodings gibt es spezielle Klassen: System.Text.Encoding.*, mit denen sich die Konvertierung m.M. nach effizienter und richtiger durchführen lässt.
Z.B. ein System.Text.Encoding.UTF8.GetBytes(„MeinUnicodeString“) liefert Dir das passende byte[].

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Eigentlich ein COM .NET Problem
Hallo zusammen,

das von mir oben genannte Problem hat sich nach weiterer Analyse als ein Problem zwischen COM und .NET erwiesen.
Ich habe eine COM-dll in eine .NET-dll eingebunden und verwende daraus eine Funktion, die einen string zurück gibt. Dieser String ist im COM-System ein Unicode-String vom Typ BStr. Das weiß, da ich den Entwickler der COM-dll kenne.
Das Problem besteht nun darin, diesen Unicode-String, der nur ANSI-Zeichen enthält, in ein entsprechendes Byte-Array zu verwandeln, wobei jedes Byte dem ANSI-Byte entsprechen soll. Aus irgendwelchen Gründen funktioniert das aber nicht mit allen Zeichen. Dabei ist es egal, ob die Konvertierung einfach über das Casten geht oder die Entsprechenden Encoding-Klassen verwendet werden.
Das Problem besteht übrigens auch in Richtung COM, wenn ich aus der .NET-dll ein Byte-Array übergeben möchte.

Hat jemand Erfahrung im Zusammenspiel von COM und .NET und kann mir in diesem Punkt weiterhelfen ?

Vielen Dank schon mal im Voraus.

Gruß,
Daniel

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo zusammen,

das von mir oben genannte Problem hat sich nach weiterer
Analyse als ein Problem zwischen COM und .NET erwiesen.
Ich habe eine COM-dll in eine .NET-dll eingebunden und
verwende daraus eine Funktion, die einen string zurück gibt.
Dieser String ist im COM-System ein Unicode-String vom Typ
BStr. Das weiß, da ich den Entwickler der COM-dll kenne.
Das Problem besteht nun darin, diesen Unicode-String, der nur
ANSI-Zeichen enthält, in ein entsprechendes Byte-Array zu
verwandeln, wobei jedes Byte dem ANSI-Byte entsprechen soll.
Aus irgendwelchen Gründen funktioniert das aber nicht mit
allen Zeichen. Dabei ist es egal, ob die Konvertierung einfach
über das Casten geht oder die Entsprechenden Encoding-Klassen
verwendet werden.
Das Problem besteht übrigens auch in Richtung COM, wenn ich
aus der .NET-dll ein Byte-Array übergeben möchte.

Hat jemand Erfahrung im Zusammenspiel von COM und .NET und
kann mir in diesem Punkt weiterhelfen ?

Vielen Dank schon mal im Voraus.

Gruß,
Daniel

[…]

Hi nochmal!
Wenn Du ein COM-Objekt ansprichst, indem Du einen entsprechenden Verweis hinzufügst, dann macht .NET daraus einen sog. RCW (Runtime Callable Wrapper), der letztlich die Aufrufe an das COM-Objekt in Form einer .NET Klasse kapselt.
Das funktioniert i.d.R. sehr gut, normalerweise wird dabei z.B. ein BSTR-Rückgabewert einer COM-Methode auf string gemappt (in .NET immer Unicode) und üblicherweise klappt das auch.
Schau’ Dir mal den string an, der vom COM-Objekt zurückkommt. Enthält der die richtigen Zeichen?
Wenn nein, dann würde ich erstmal die Schuld auf das COM-Objekt schieben.
Andererseits kannst Du auch mal versuchen, selbst mittels des MarshalAsAttribute festzulegen, wie die einzelnen Parameter zwischen .NET und COM gemarshalt werden.
Zu dem Thema gibt es eine recht ausführliche Abhandlung im MSDN.
Such’ z.B. mal nach „Standardmäßiges Marshalling für Zeichenfolgen“.

Martin