【发布时间】: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