我使用http://www.developerfusion.com/tools/convert/csharp-to-vb/将这段 C# 代码翻译成 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]);
to的翻译decoded += Convert.ToString(ChrW(buffer(index)))
。
ChrW 是否产生与转换为 char 相同的结果,哪种编码将正确复制字节数组的读取?
编辑:我总是有 Option Strict On 但原始 C# 可能没有,因此它可能会受到隐式转换的影响。在这种情况下编译器会做什么?