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

Rob*_*Dam 0 .net c# vb6 binary

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

替代文字

以下代码用于在旧的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
Run Code Online (Sandbox Code Playgroud)

现在我想用我的新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();
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

Tim*_*son 5

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

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

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