Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
C# 如何在.NET和vb6之间读写可互操作的字符串到二进制文件_C#_Vb6 - Fatal编程技术网

C# 如何在.NET和vb6之间读写可互操作的字符串到二进制文件

C# 如何在.NET和vb6之间读写可互操作的字符串到二进制文件,c#,vb6,C#,Vb6,我有一个用C#编写的新程序,它需要读写与vb6二进制格式兼容的二进制文件。我不能更改vb6程序,但我可以更改我的程序 我什么都能用,除了我对弦有点怀疑 如果我在vb6中编写以下内容 Private Type PatchRec string As String End Type Private Sub Command1_Click() Dim intFileNum As Integer Dim recTest As TestRec intFileNum = Free

我有一个用C#编写的新程序,它需要读写与vb6二进制格式兼容的二进制文件。我不能更改vb6程序,但我可以更改我的程序

我什么都能用,除了我对弦有点怀疑

如果我在vb6中编写以下内容

Private Type PatchRec
   string As String
End Type

Private Sub Command1_Click()
    Dim intFileNum As Integer
    Dim recTest As TestRec
    intFileNum = FreeFile
    Open "E:\testing" & "\" & "testfile" & ".bin" For Binary Access Write As #intFileNum
    recTest.string = "This is a test string"    
    Put #intFileNum, , recPatch
    Close #intFileNum
End Sub
我用C写了下面的内容#

我得到这两个十六进制字符串

vb6 - 15 00 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 74 72 69 6E 67
c# -     15 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 74 72 69 6E 67
在编写字符串时,BinaryWriter在这两者之间似乎不一样,vb6使用两个字节的字符串,C#使用UTF-7编码的无符号int。此外,我找不到VB以这种方式编写文件时使用的编码的任何资源


是否有任何内置工具可以像vb6那样编写,如果没有,除了将长度转换为uint16之外,是否还有其他需要注意的问题?

它只是一个包含字符串长度的短字符串,请使用BinaryWriter(短)。不要使用BinaryWriter.Write(字符串),请使用BinaryWriter.Write(字节[]),从编码中获取字节[]。默认值。GetBytes()


有意避免Microsoft.VisualBasic命名空间中的compat函数可能不是最有效的方法。它不需要字节,框架也不关心你使用什么语言。请看一看Microsoft.VisualBasic.FileSystem.FilePut()。可以在任何.NET framework版本中使用,这是您不必维护的代码,并且已经过数千次测试。您必须添加对Microsoft.VisualBasic的程序集引用。

您看到这个答案了吗?-也许使用FilePut很诱人?+1。OP询问“是否有任何内置工具可以像VB6那样编写?”是的,
Microsoft.VisualBasic.FileSystem.FilePutObject
就是专门为此而创建的。而
FileGetObject
是读取的配套方法。其他方法可能效率很低。FilePutObject在二进制模式下使用时不会写出长度字节。没错,我研究了这个问题,同意海报上的说法,FilePut()最适合编写结构。
vb6 - 15 00 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 74 72 69 6E 67
c# -     15 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 74 72 69 6E 67