Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Encoding.Default.GetBytes()在VB.NET和C#中返回不同的结果?_C#_Vb.net_Encoding - Fatal编程技术网

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

为什么Encoding.Default.GetBytes()在VB.NET和C#中返回不同的结果?,c#,vb.net,encoding,C#,Vb.net,Encoding,我们最近遇到了一个供应商提供的一些示例代码,用于对web服务调用的密钥进行哈希运算,他们的示例是在VB.NET中,我们将其转换为C#。这导致散列产生不同的输入。事实证明,他们生成加密密钥的方式是将字符数组转换为字符串,然后再转换回字节数组。这让我发现VB.NET和C#的默认编码器对某些字符的工作方式不同 C#: VB: C#输出是63,而VB是正确的字节值149。 如果使用任何其他值,如145等,则输出匹配 在调试过程中,VB和C#默认编码器都是SBCSCodePageEncoding 有人知道

我们最近遇到了一个供应商提供的一些示例代码,用于对web服务调用的密钥进行哈希运算,他们的示例是在VB.NET中,我们将其转换为C#。这导致散列产生不同的输入。事实证明,他们生成加密密钥的方式是将字符数组转换为字符串,然后再转换回字节数组。这让我发现VB.NET和C#的默认编码器对某些字符的工作方式不同

C#:

VB:

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

在调试过程中,VB和C#默认编码器都是SBCSCodePageEncoding

有人知道这是为什么吗

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

因为它使用当前代码页,所以它既依赖于机器,也依赖于线程。您通常应该使用Encoding.UTF8之类的东西,这样您就不必担心当一台机器使用unicode而另一台机器使用1252-ANSI时会发生什么

可能会使用不同的操作系统 默认情况下使用不同的编码。 因此,数据流从一个 另一个操作系统可能是 翻译错误。确保 编码的字节被解码 正确地说,您的应用程序应该使用 Unicode编码,即, UTF8编码、Unicode编码或 UTF32编码,带有前导码。 另一个选择是使用 更高级别的协议,以确保 相同的格式用于编码 和解码

当你使用utf8显式编码时,你能检查每种语言产生了什么吗?

如果你使用ChrW(149),你会得到不同的结果-63,与C#相同


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

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

ChrW将获取一个16位的值并返回相应的System.Char值,而不使用编码-因此将给出与您发布的C#代码相同的结果

在不使用VB字符串类(即包含Chr和ChrW的类)的情况下,C#中的VB代码的近似等效值为:

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

我相信VB中的等价物是ChrW(149)

所以,这个VB代码

    Dim c As Char() = New Char() { Chr(149) }
    'Dim c As Char() = New Char() { ChrW(149) }
    Dim b As Byte() = System.Text.Encoding.Default.GetBytes(c)
    Console.WriteLine("{0}", Convert.ToInt32(c(0)))
    Console.WriteLine("{0}", CInt(b(0)))
生成与此C#代码相同的输出


这里有一个到文档的链接:干杯,Jon-我正在添加链接。谢谢!我认为这与Chr()位有关,但我不确定如何避免在VB.NET中使用Chr()。我认为不清楚为什么会得到不同的结果。根据,您的答案将根据Windows的默认编码而更改。
Dim b As Char() = {ChrW(149)}
Console.WriteLine(Encoding.Default.GetBytes(b)(0))
char[] chars = Encoding.Default.GetChars(new byte[] { 149 });
Console.Write(Encoding.Default.GetBytes(chars)[0]);
    Dim c As Char() = New Char() { Chr(149) }
    'Dim c As Char() = New Char() { ChrW(149) }
    Dim b As Byte() = System.Text.Encoding.Default.GetBytes(c)
    Console.WriteLine("{0}", Convert.ToInt32(c(0)))
    Console.WriteLine("{0}", CInt(b(0)))
    var c = new char[] { (char)149 };
    var b = System.Text.Encoding.Default.GetBytes(c);
    Console.WriteLine("{0}", (int)c[0]);  
    Console.WriteLine("{0}", (int) b[0]);