为什么Encoding.Default.GetBytes()在VB.NET和C#中返回不同的结果?

Ann*_*ram 7 c# vb.net encoding

我们最近遇到了一些来自供应商的示例代码,用于散列Web服务调用的密钥,他们的示例是在我们转换为C#的VB.NET中.这导致散列产生不同的输入.事实证明,他们生成加密密钥的方式是将char数组转换为字符串并返回字节数组.这让我发现VB.NET和C#的默认编码器与某些字符的工作方式不同.

C#:

Console.Write(Encoding.Default.GetBytes(new char[] { (char)149 })[0]);
Run Code Online (Sandbox Code Playgroud)

VB:

Dim b As Char() = {Chr(149)}
Console.WriteLine(Encoding.Default.GetBytes(b)(0))
Run Code Online (Sandbox Code Playgroud)

C#输出为63,而VB是正确的字节值149.如果使用任何其他值,如145等,输出匹配.

通过调试,VB和C#默认编码器都是SBCSCodePageEncoding.

有人知道为什么吗?

我已经通过直接初始化一个字节数组来纠正了示例代码,它本来应该是第一个,但我仍然想知道为什么编码器(不应该是特定于语言的)看起来就是这样.

Ric*_*dOD 10

如果使用ChrW(149),您将获得不同的结果 - 63,与C#相同.

Dim b As Char() = {ChrW(149)}
Console.WriteLine(Encoding.Default.GetBytes(b)(0))
Run Code Online (Sandbox Code Playgroud)

阅读文档以查看差异 - 这将解释答案

  • 这是文档的链接:http://msdn.microsoft.com/en-us/library/613dxh46(VS.80).aspx (2认同)

Joe*_*Joe 5

VB Chr函数接受0到255范围内的参数,并使用当前默认代码页将其转换为字符.如果传递超出此范围的参数,它将抛出异常.

ChrW将采用16位值并返回相应的System.Char值而不使用编码 - 因此将得到与您发布的C#代码相同的结果.

在不使用VB Strings类(包含Chr和ChrW的类)的情况下,C#中VB代码的大致相当于:

char[] chars = Encoding.Default.GetChars(new byte[] { 149 });
Console.Write(Encoding.Default.GetBytes(chars)[0]);
Run Code Online (Sandbox Code Playgroud)