Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从二进制文件读取可变大小的字符串(VB6与C#)_C#_.net_Vb6_Binary - Fatal编程技术网

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

从二进制文件读取可变大小的字符串(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

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

以下代码用于在旧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#程序来阅读这篇文章:

但是,我在调用Marshal.PtrToStructure时收到一个AccessViolationException


有什么建议吗

Marshal.PtrToStructure
希望
缓冲区中充满指向字符串的指针。我认为
Marshal
不能用来做你想做的事

相反,您需要确定二进制文件格式,并手动为此编写代码。看看这门课


编辑:如果卡住了,可以添加对Microsoft.VisualBasic.dll的引用并使用该方法。这与VB6中的
Get
关键字的行为相同。

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

完全按照您想要的方式进行数据类型封送是非常棘手的,而且由于您不进行互操作,所以根本不需要封送。使用
BinaryReader
从文件中读取数据更容易

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

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

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

+1 for
FileSystem.FileGetObject
这可能是最简单的方法。在帮助“如果要读入的变量是字符串,默认情况下FileGetObject读取包含字符串长度的两字节描述符,然后读取进入变量的数据”中,问题中的十六进制视图确认字符串是这样写的:字符串的长度以字节为单位,然后是字符串。字符串编码将是您的Windows ANSI编码,如果您位于西欧(?)可能是Windows 1252
string value = reader.ReadChars(reader.ReadShort());