Converting byte array to string with correct encoding

c#, migration, vb.net

Solution

Quick answer

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

is equivalent to

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

VB.Net stops you taking the hacky approach used in the c# code, a `Char` is Unicode so consists of two bytes.

This looks likes a better implementation of what you have.

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

Problem

I have this bit of C# code that I have translated to VB using http://www.developerfusion.com/tools/convert/csharp-to-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); } ``` Which, after a little modification, gives this: ``` 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 just rearranges the array in a specific way and I've checked the VB and C# outputs against each other so it can be ignored. It's inputs and outputs are byte arrays so it shouldn't affect the encoding. The problem lies in that the result of this function is fed into a hashing algorithm which is then compared against the hashing signature. The result of the VB version, when hashed, does not match to the signature. You can see from the comments that I've attempted to use different encodings to get the byte buffer out as a string but none of these have worked. The problem appears to lie in the transalation of `decoded += Convert.ToString((char)buffer[i]);` to `decoded += Convert.ToString(ChrW(buffer(index)))`. Does ChrW produce the same result as casting as a char and which encoding will correctly duplicate the reading of the byte array? Edit: I always have Option Strict On but it's possible that the original C# doesn't so it may be affected by implicit conversion. What does the compiler do in that situation?

Original source