http://www.developerfusion.com/tools/convert/csharp-to-vb/を使用してVBに変換したこのC#コードがあります
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
スクランブルは特定の方法で配列を再配置するだけで、VB出力とC#出力を相互にチェックしたので、無視できます。入力と出力はバイト配列であるため、エンコーディングに影響を与えることはありません。
問題は、この関数の結果がハッシュアルゴリズムに入力され、ハッシュ署名と比較されることにあります。VBバージョンの結果は、ハッシュされた場合、署名と一致しません。
コメントから、バイトバッファを文字列として取得するためにさまざまなエンコーディングを使用しようとしましたが、いずれも機能しなかったことがわかります。
問題はtoの翻訳にあるdecoded += Convert.ToString((char)buffer[i]);
ようdecoded += Convert.ToString(ChrW(buffer(index)))
です。
ChrWはcharとしてキャストするのと同じ結果を生成し、どのエンコーディングがバイト配列の読み取りを正しく複製しますか?
編集:私は常にOption Strict Onを使用していますが、元のC#がオンになっていない可能性があるため、暗黙的な変換の影響を受ける可能性があります。その状況でコンパイラは何をしますか?