【问题标题】:Visual Basic to C#: load binary file in a stringVisual Basic 到 C#:在字符串中加载二进制文件
【发布时间】:2017-02-09 03:01:14
【问题描述】:

我必须将一个项目从旧的 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

立即窗口中的结果:

1

10

133

C#代码:

public static string LoadText(string dirIn)
    {

        string myString, myString2;
        FileStream fs = new FileStream(dirIn, FileMode.Open);
        BinaryReader br = new BinaryReader(fs);

        byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
        //myString = Convert.ToBase64String(bin);

        myString =  Encoding.Default.GetString(bin);
        string m1 = Encoding.Default.GetString(bin);
        //string m1 =  Encoding.ASCII.GetString(bin);  
        //string m1 =  Encoding.BigEndianUnicode.GetString(bin);
        //string m1 = Encoding.UTF32.GetString(bin);
        //string m1 = Encoding.UTF7.GetString(bin);
        //string m1 = Encoding.UTF8.GetString(bin);
        //string m1 = Encoding.Unicode.GetString(bin);
        //string m1 = Encoding.Unicode.GetString(bin);


        Console.WriteLine(General.Asc(m1.Substring(0, 1)));
        Console.WriteLine(General.Asc(m1.Substring(1, 1)));
        Console.WriteLine(General.Asc(m1.Substring(2, 1)));

        br.Close();
        fs.Close();
        return myString;
}

普通类:

public static int Asc(string stringToEValuate)
{
    return (int)stringToEValuate[0];
}

输出窗口中的结果:

1

10

8230

VB6 中的字符串长度为 174848,与测试文件的大小相同。

在 c# 中 DEFAUILT 和 ASCII 编码的大小相同,而所有其他的大小不同,除非我在整个项目中进行任何更改,否则我无法使用它们。

问题是我找不到正确的编码来允许有一个字符串,它的 asc 函数返回与 VB6 相同的数字。

问题就在这里,如果字符串不一样我要改很多行代码,因为整个程序是基于ASCii值和它在字符串中的位置。

可能是将二进制文件加载到字符串或 Asc 函数中的错误方法..

如果您想尝试示例文件,可以从这里下载:

http://www.snokie.org/testme.bin

【问题讨论】:

  • 过去经历过这样的任务,您不想保留旧代码。它会给你带来比它的价值更多的头痛。即使您要从 VB6 转到 VB.Net,我也建议您全部重写
  • 您是否尝试查看存储在字节数组中的值是什么?
  • 你试过用编码实例化 BinaryReader:BinaryReader br = new BinaryReader(stream, Encoding.ASCII);

标签: c# string encoding binary vb6


【解决方案1】:

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

没有文本,只有编码文本。

当您读取文本文件时,您必须知道用于写入它的编码。读入 .NET String 或 Char 后,您就拥有了 Unicode 的 UTF-16 编码。因为 Unicode 是您将使用的任何字符集的超集,所以它不是不正确的。

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

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

【讨论】:

    【解决方案2】:

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

    Get #ContIN, , FileBuffer 将系统的默认 ANSI 代码页转换为 UTF-16,Asc 将其再次转换回来。因此,您也只需在 .NET 代码中执行此操作。

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

    参考 Microsoft.VisualBasic.dll 和

    using static Microsoft.VisualBasic.Strings;
    

    然后

    var fileBuffer = File.ReadAllText(path, Encoding.Default); 
    Debug.WriteLine(Asc(Mid(fileBuffer, 3, 1));
    

    如果您不想将 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多