3

我使用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# 可能没有,因此它可能会受到隐式转换的影响。在这种情况下编译器会做什么?

4

4 回答 4

3

快速回答

decoded += Convert.ToString((char)buffer[i]);

相当于

decoded &= Convert.ToString(Chr(buffer[i]));

VB.Net 阻止您采用 c# 代码中使用的 hacky 方法,aChar是 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
于 2012-10-03T09:30:17.153 回答
0

试一试:

decoded += Convert.ToChar(foo)

它会起作用(不像我上次尝试假设隐式转换是特定于框架而不是特定于语言的),但我不能保证它与.NET 相同。

鉴于您在评论中说您希望使用Encoding.xxx.GetString,那么您为什么不使用它呢?你知道原始字符串到字节数组中的编码是什么吗?如果是这样,那么就使用它。无论如何,这是将字节数组转换为字符串的正确方法,因为逐字节进行操作肯定会因任何多字节字符而中断(显然)。

于 2012-10-02T16:09:19.387 回答
0

有没有试过最直接的代码翻译:

decoded += Convert.ToString(CType(buffer[i], char))

在将字节数组转换为字符串时,您确实应该首先确保您知道编码。如果这是在提供字节数组的任何内容中设置的,那么您应该使用它来解码字符串。

有关 ChrW(和 Chr)函数的更多详细信息,请查看http://msdn.microsoft.com/en-us/library/613dxh46%28v=vs.80%29.aspx。本质上,ChrW 假定传递的 int 是一个 unicode 代码点,这可能不是一个有效的假设(我相信从 0 到 127 这无关紧要,但字节的上半部分可能不同)。如果这是问题所在,那么它很可能是重音和其他导致问题的“特殊”字符。

于 2012-10-02T16:10:55.850 回答
0

一个小小的改进

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 = System.Text.Encoding.Unicode.GetString(buffer, 0, buffer.Length);

    Return descrambled
End Function
于 2014-02-06T00:06:17.043 回答