我有这段 C# 代码,我已使用 http://www.developerfusion.com/tools/convert/csharp-to-vb/ 将其转换为 VB
private string DecodeToken (string token, string key)
{
byte [] buffer = new byte[0];
string decoded = "";
int i;
if (Scramble (Convert.FromBase64String(token), key, ref buffer))
{
for (i=0;i<buffer.Length;i++)
{
decoded += Convert.ToString((char)buffer[i]);
}
}
return(decoded);
}
稍作修改后,给出了这个:
Private Function DecodeToken(token As String, key As String) As String
Dim buffer As Byte()
Dim decoded As String = ""
Dim index As Integer
If Scramble(Convert.FromBase64String(token), key, buffer) Then
For index = 0 To buffer.Length - 1
decoded += Convert.ToString(ChrW(buffer(index)))
Next
'decoded = UTF8Encoding.ASCII.GetString(pbyBuffer)
'decoded = UnicodeEncoding.ASCII.GetString(pbyBuffer)
'decoded = ASCIIEncoding.ASCII.GetString(pbyBuffer)
End If
Return decoded
End Function
Scramble 只是以特定方式重新排列数组,我已经检查了 VB 和 C# 的输出,因此可以忽略它。它的输入和输出是字节数组,所以它不应该影响编码。
问题在于该函数的结果被输入到哈希算法中,然后将其与哈希签名进行比较。 VB 版本的结果在散列时与签名不匹配。
您可以从评论中看到,我曾尝试使用不同的编码将字节缓冲区作为字符串输出,但这些都不起作用。
问题似乎在于 decoded += Convert.ToString((char)buffer[i]);
到 decoded += Convert.ToString(ChrW(buffer(索引)))
。
ChrW 是否产生与转换为 char 相同的结果,哪种编码将正确复制字节数组的读取?
编辑:我总是启用 Option Strict,但原始 C# 可能没有,因此它可能会受到隐式转换的影响。编译器在这种情况下会做什么?
最佳答案
快速回答
decoded += Convert.ToString((char)buffer[i]);
相当于
decoded &= Convert.ToString(Chr(buffer[i]));
VB.Net 阻止您采用 c# 代码中使用的 hacky 方法,Char
是 Unicode,因此由两个字节组成。
这看起来像是对您现有内容的更好实现。
Private Function DecodeToken(encodedToken As String, key As String) As String
Dim scrambled = Convert.FromBase64String(encodedToken)
Dim buffer As Byte()
Dim index As Integer
If Not Scramble(scrambled, key, buffer) Then
Return Nothing
End If
Dim descrambled = new StringBuilder(buffer.Length);
For index = 0 To buffer.Length - 1
descrambled.Append(Chr(buffer(index)))
Next
Return descrambled.ToString()
End Function
关于c# - 使用正确的编码将字节数组转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694018/