从二进制文件中读取变量大小的字符串(VB6与C#)

我有一个包含以下内容的二进制文件:

替代文字

以下代码用于在旧的VB6程序中读取此内容:

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 

现在我正在尝试用我的新C#程序阅读:

 [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(); 

但是,我在调用Marshal.PtrToStructure时遇到了AccessViolationException。

有什么建议?

首先,你的结构根本不应该是一个结构,而是一个类。 结构适用于表示单个值的小型不可变类型。

使数据类型编组完全符合您的要求是非常棘手的,因为您没有进行互操作,所以根本不需要编组。 使用BinaryReader从文件中读取数据更容易。

简单的数据类型可以直接读取,字符串可以这样读取:

 string value = reader.ReadChars(reader.ReadShort()); 

打开阅读器时指定适当的单字节编码,例如windows-1252。

Marshal.PtrToStructure期望buffer充满指向字符串的指针。 我不认为Marshal可以用来做你想做的事。

相反,您需要确定二进制文件格式并手动编写代码。 看看BinaryReader类。

编辑:如果您遇到困难,可以添加对Microsoft.VisualBasic.dll的引用并使用FileSystem.FileGetObject方法。 其行为与VB6中的Get关键字相同。