Visual Basic到C#:以字符串形式加载二进制文件

Visual Basic到C#:以字符串形式加载二进制文件,c#,string,encoding,binary,vb6,C#,String,Encoding,Binary,Vb6,我必须将一个项目从旧的VB6转换为c#,目的是尽可能多地保留旧代码,以防时间问题 旧项目的函数将二进制文件加载到字符串变量中,然后使用asc函数以单个字符值分析该变量: 旧VB代码: Public Function LoadText(ByVal DirIn As String) As String Dim FileBuffer As String Dim LenghtFile As Long Dim ContIN As Long ContIN = FreeFil

我必须将一个项目从旧的VB6转换为c#,目的是尽可能多地保留旧代码,以防时间问题

旧项目的函数将二进制文件加载到字符串变量中,然后使用asc函数以单个字符值分析该变量:

旧VB代码:

Public Function LoadText(ByVal DirIn As String) As String
    Dim FileBuffer As String
    Dim LenghtFile As Long
    Dim ContIN As Long

    ContIN = FreeFile
    Open DirIn For Binary Access Read As #ContIN
    LenghtFile = LOF(ContIN)
    FileBuffer = Space(LenghtFile)
    Get #ContIN, , FileBuffer
    Close #ContIN
    LoadText = FileBuffer
    'following line for test purpose
    debug.print(asc(mid(filebuffer,1,1)))
    debug.print(asc(mid(filebuffer,2,1)))
    debug.print(asc(mid(filebuffer,3,1)))
End Function

SUB Main
    dim testSTring as String
    teststring=loadtext("e:\testme.bin")
end sub
结果显示即时窗口:

一,

十,

133

C#代码:

普通班:

public static int Asc(string stringToEValuate)
{
    return (int)stringToEValuate[0];
}
输出窗口中的结果:

一,

十,

82308230是正确的。它是Unicode代码点(U+2026,只需要一个UTF-16代码单元)的UTF-16代码单元。你以为是133。133 as one byte是至少一个其他字符集中相同字符的编码:Windows-1252

没有文本,只有编码文本

当你读一个文本文件时,你必须知道用来写它的编码。一旦读入.NET字符串或字符,就可以使用Unicode的UTF-16编码。因为Unicode是您将要使用的任何字符集的超集,所以它不是不正确的

如果不想将字符作为字符进行比较,请将其作为二进制文件读取,以使其与文件的编码相同。然后可以比较字节序列

问题是VB6代码没有像它应该使用的那样使用Unicode作为字符代码,而是使用了“默认ANSI”字符集,这会在系统和用户之间改变含义。

8230是正确的。它是Unicode代码点(U+2026,只需要一个UTF-16代码单元)的UTF-16代码单元。你以为是133。133 as one byte是至少一个其他字符集中相同字符的编码:Windows-1252

没有文本,只有编码文本

当你读一个文本文件时,你必须知道用来写它的编码。一旦读入.NET字符串或字符,就可以使用Unicode的UTF-16编码。因为Unicode是您将要使用的任何字符集的超集,所以它不是不正确的

如果不想将字符作为字符进行比较,请将其作为二进制文件读取,以使其与文件的编码相同。然后可以比较字节序列

问题是VB6代码没有像它应该使用的那样使用Unicode作为字符代码,而是使用了“默认ANSI”字符集,这会在系统和用户之间改变含义。

问题在于:“旧项目将二进制文件加载到字符串变量中”。是的,这是一种常见但糟糕的VB6实践。字符串数据类型用于文本。VB6中的字符串是UTF-16代码单元序列,就像.NET(以及Java、JavaScript、HTML、XML等)中的字符串一样

Get#ContIN,FileBuffer
将系统默认的ANSI代码页转换为UTF-16,并再次将其转换回。所以,您也必须在.NET代码中这样做

注意:就像在VB6中一样,Encoding.Default是危险的,因为它可能因系统和用户而异

参考Microsoft.VisualBasic.dll和

using static Microsoft.VisualBasic.Strings;
然后

如果您不想将Microsoft.VisualBasic.dll引入C#项目,您可以编写自己的版本

static class VB6StringReplacements
{
    static public Byte Asc(String source) => 
        Encoding.Default.GetBytes(source.Substring(0,1)).FirstOrDefault();

    static public String Mid(String source, Int32 offset, Int32 length) => 
        source.Substring(offset, length);
}
并且,将using指令更改为

using static VB6StringReplacements;
问题是:“旧项目将二进制文件加载到字符串变量中”。是的,这是一种常见但糟糕的VB6实践。字符串数据类型用于文本。VB6中的字符串是UTF-16代码单元序列,就像.NET(以及Java、JavaScript、HTML、XML等)中的字符串一样

Get#ContIN,FileBuffer
将系统默认的ANSI代码页转换为UTF-16,并再次将其转换回。所以,您也必须在.NET代码中这样做

注意:就像在VB6中一样,Encoding.Default是危险的,因为它可能因系统和用户而异

参考Microsoft.VisualBasic.dll和

using static Microsoft.VisualBasic.Strings;
然后

如果您不想将Microsoft.VisualBasic.dll引入C#项目,您可以编写自己的版本

static class VB6StringReplacements
{
    static public Byte Asc(String source) => 
        Encoding.Default.GetBytes(source.Substring(0,1)).FirstOrDefault();

    static public String Mid(String source, Int32 offset, Int32 length) => 
        source.Substring(offset, length);
}
并且,将using指令更改为

using static VB6StringReplacements;

在过去经历过这样的任务后,您不希望保留旧代码。这会让你头疼得要命。即使您将VB6转到VB.Net,我也建议您全部重写它。您是否尝试查看字节数组中存储的值?您是否三次使用编码实例化BinaryReader:BinaryReader br=new BinaryReader(stream,encoding.ASCII);在过去经历过这样的任务后,您不希望保留旧代码。这会让你头疼得要命。即使您将VB6转到VB.Net,我也建议您全部重写它。您是否尝试查看字节数组中存储的值?您是否三次使用编码实例化BinaryReader:BinaryReader br=new BinaryReader(stream,encoding.ASCII);