Laden...

Shared Memory mit Strings in Struct

Erstellt von Gerri3d vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.824 Views
G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 7 Jahren
Shared Memory mit Strings in Struct

Hallo,

ich will ein (oder je ein) struct in C# mit einigen Daten zu lesen und zu schreiben.

EIn Prozes (SPS) hat definierte String Größen, somit weiß ich die Größe theoretisch.

Wie kann ich nun auf der C# Seite eine fixe Größe definieren (Referenzenieren ist ja nicht erlaubt bzw geht nicht, da ja keine fixe Größe ermittelbar ist).

W
872 Beiträge seit 2005
vor 7 Jahren

Schau mal unter Default Marshalling nach.
Da solltest Du alles finden - insbesondere ob der String terminiert oder nicht terminiert ist, solltest Du noch prüfen.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 7 Jahren

Das Proble ist etwas komplexer.

Ich bekomme von der Gegenseite Ascii Character in den shared Memory, auf der C# Seite sind diese CHarackter jedoch 2 byte. Dadurch ist der Zugriff schon mal nicht konsistent.

Wie kann ich die fixed CHAR als Ascii definieren und anschließend in einen String umwandeln für die weitere C# bearbeitung?

709 Beiträge seit 2008
vor 7 Jahren

Das CharSet kann man im StructLayoutAttribute auf CharSet.Ansi umstellen.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 7 Jahren

ANSI hat aber auch 2 Bytes. wenn ich die Größe ermittle, erhalte ich die zweifache Zeichenanzahl als Wert zurück.

709 Beiträge seit 2008
vor 7 Jahren

Laut Doku sollte Ansi nur Zeichen mit der Länge von einem Byte haben. 🤔

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 7 Jahren

mit Marshal.SizeOf(typeof..
komme ich bei einem char[1] auf den Wert 2.

709 Beiträge seit 2008
vor 7 Jahren

Der .NET-Datentyp System.Char ist auch immer 2 Byte groß.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 7 Jahren

danke für die Info. Werds jetzt in Byte ienlesen, nur hab ich das Problem das ichmit einem Fixed byte[] keine möglichkiet finde, diesen in einen String zu konvertieren.

709 Beiträge seit 2008
vor 7 Jahren

Da könnte ASCIIEncoding.GetString helfen.