ich eine binäre Datei mit folgendem Inhalt haben:Lesen variabler Größe String aus Binärdatei (VB6 vs. C#)
Der folgende Code verwendet wird, diese Inhalte in alten VB6-Programm zu lesen:
Private Type tpClient
Firstname As String
LastName As String
Birth As String
Adres As String
Geslacht As String
IDNummer As Long
SSNummer As String
DatabaseID As Long
Telefoon1 As String
Telefoon2 As String
End Type
Open strFilePath For Random Access Read As #intFileNumber
Get #intFileNumber, 1, ClientData ' ClientData is of type tpClient
Jetzt versuche ich dies mit meinem neuen C# Programm zu lesen:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct PatientStruct
{
[MarshalAs(UnmanagedType.BStr)]
public string FirstName;
[MarshalAs(UnmanagedType.BStr)]
public string LastName;
[MarshalAs(UnmanagedType.BStr)]
public string BirthDate;
[MarshalAs(UnmanagedType.BStr)]
public string Address;
[MarshalAs(UnmanagedType.BStr)]
public string Gender;
[MarshalAs(UnmanagedType.BStr)]
public string IdNumber;
[MarshalAs(UnmanagedType.BStr)]
public string SsNumber;
[MarshalAs(UnmanagedType.BStr)]
public string DatabaseId;
[MarshalAs(UnmanagedType.BStr)]
public string Telephone1;
[MarshalAs(UnmanagedType.BStr)]
public string Telephone2;
}
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, (int)stream.Length);
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
T stuff = (PatientStruct)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
Ich erhalte jedoch eine AccessViolationException beim Aufruf von Marshal.PtrToStructure.
Irgendwelche Vorschläge?
+1 für 'FileSystem.FileGetObject' Dies ist wahrscheinlich der einfachste Weg. Aus der Hilfe "Wenn die einzulesende Variable eine Zeichenfolge ist, liest FileGetObject standardmäßig einen Zwei-Byte-Deskriptor, der die Zeichenfolge enthält, und liest dann die Daten in die Variable" Die Hex-Ansicht in Ihrer Frage bestätigt, dass die Zeichenfolgen geschrieben wurden so: Länge der Zeichenkette in Bytes, dann die Zeichenkette. Die Zeichenfolgencodierung ist Ihre Windows ANSI-Codierung, wahrscheinlich Windows 1252, wenn Sie in Westeuropa ansässig sind (?) – MarkJ