c# - 使用正确的编码将字节数组转换为字符串

标签 c# vb.net migration

我有这段 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/

相关文章:

c# - 如何在我的 XML 文件中存储对元素的引用?

c# - 正则表达式匹配一个或两个数字

java - 我可以在不重新运行迁移的情况下修复 Flyway 中的版本号吗?

java - Java5/Java6 应用程序到 Java 7 的周到迁移计划?

sql - 连接被拒绝:Laravel

c# - 将盒子定位到 td 的底部

c# - Android - Bitmap.CreateBitmap - 空指针异常

.net - vb.net 中的绝对值

vb.net - 多个面板和组框以及选项卡顺序维护

vb.net - 在VB中将列表转换为字典