从二进制文件读取可变大小的字符串(VB6与C#)
我有一个包含以下内容的二进制文件: 以下代码用于在旧VB6程序中读取此内容:从二进制文件读取可变大小的字符串(VB6与C#),c#,.net,vb6,binary,C#,.net,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 Telefoo
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#程序来阅读这篇文章:
但是,我在调用Marshal.PtrToStructure时收到一个AccessViolationException
有什么建议吗
Marshal.PtrToStructure
希望缓冲区中充满指向字符串的指针。我认为Marshal
不能用来做你想做的事
相反,您需要确定二进制文件格式,并手动为此编写代码。看看这门课
编辑:如果卡住了,可以添加对Microsoft.VisualBasic.dll的引用并使用该方法。这与VB6中的Get
关键字的行为相同。首先,您的结构不应该是一个结构,而应该是一个类。结构用于表示单个值的小型、不可变类型
完全按照您想要的方式进行数据类型封送是非常棘手的,而且由于您不进行互操作,所以根本不需要封送。使用BinaryReader
从文件中读取数据更容易
简单的数据类型可以直接读取,字符串可以这样读取:
string value = reader.ReadChars(reader.ReadShort());
在打开读卡器时指定适当的单字节编码,例如windows-1252。+1 forFileSystem.FileGetObject
这可能是最简单的方法。在帮助“如果要读入的变量是字符串,默认情况下FileGetObject读取包含字符串长度的两字节描述符,然后读取进入变量的数据”中,问题中的十六进制视图确认字符串是这样写的:字符串的长度以字节为单位,然后是字符串。字符串编码将是您的Windows ANSI编码,如果您位于西欧(?)可能是Windows 1252
string value = reader.ReadChars(reader.ReadShort());