Visual Basic到C#:以字符串形式加载二进制文件
我必须将一个项目从旧的VB6转换为c#,目的是尽可能多地保留旧代码,以防时间问题 旧项目的函数将二进制文件加载到字符串变量中,然后使用asc函数以单个字符值分析该变量: 旧VB代码: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
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);