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

7
我是一个有用的助手,可以翻译文本。
我正在使用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#写下了以下内容"
public static void Main(params string[] args)
{
    using(var fs = new FileStream("test.bin", FileMode.Create, FileAccess.ReadWrite))
    using (var bw = new BinaryWriter(fs))
    {
        string str = "This is a test string";
        bw.Write(str);
    }
}

我得到了这两个十六进制字符串
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# 中似乎不相同。VB6 使用两个字节的字符串,而 C# 使用 UTF-7 编码的无符号整数。此外,我找不到任何资源来说明 VB 在这种方式下使用了哪种编码来写入文件。
是否有内置工具可以按照 VB6 的方式进行写入?如果没有,除了将长度转换为 uint16,还需要注意哪些问题?

1
你看过这个答案吗?https://dev59.com/LFrUa4cB1Zd3GeqPoepu#7330607 - 或许使用FilePut会很诱人? - Marc Gravell
1个回答

9

这只是一个包含字符串长度的short,使用BinaryWriter(short)。不要使用BinaryWriter.Write(string),而是使用从Encoding.Default.GetBytes()获取的byte[]进行BinaryWriter.Write(byte[])。

故意避免使用Microsoft.VisualBasic命名空间中的兼容函数可能不是最有效的方法。框架不在乎你使用什么语言。看看Microsoft.VisualBasic.FileSystem.FilePut()。它在任何.NET框架版本中都可用,这是您无需维护且已经被数千人测试的代码。您需要添加对Microsoft.VisualBasic的程序集引用。


+1. OP问:“是否有内置工具可以像VB6一样编写?”是的,Microsoft.VisualBasic.FileSystem.FilePutObject就是专门为此而创建的。而FileGetObject则是用于读取的伴侣方法。其他替代方法可能会非常低效。 - MarkJ
FilePutObject在二进制模式下使用时不会写出长度字节,请查看我的新问题 - Scott Chamberlain
你说得对,我研究了那个问题,并同意发帖者的观点,认为FilePut()最适合写入结构体。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接