I need to encode a string using Base64. I have a VB6 algorithm and I need to write a C# version exactly. I was able to get it right 99% but the last character is wrong and I'm not sure what exactly is going wrong.
Here is the string to encode:
¼9ÀPʨ!Œaøc4vøÝFãgïÒ_£¡˜è/[t•Ôý56wBpïcÃ.Cð`
VB6 Encoding gives the following string:
vDnAUMqoFiGMYfhjNHb43UbjZ+/SX6MBoZjoL1t0ldT9NTZ3QnDvYwMTww4uQ/Ag
C# encoding gives the following string:
vDnAUMqoFiGMYfhjNHb43UbjZ+/SX6MBoZjoL1t0ldT9NTZ3QnDvYwMTww4uQ/Ax
As you can see everything is the same except the last letter.
VB6 Algorithm :
Const sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Function Base64encode(ByVal asContents)
Dim lnPosition
Dim lsResult
Dim Char1
Dim Char2
Dim Char3
Dim Char4
Dim Byte1
Dim Byte2
Dim Byte3
Dim SaveBits1
Dim SaveBits2
Dim lsGroupBinary
Dim lsGroup64
If Len(asContents) Mod 3 > 0 Then asContents = asContents & String(3 - (Len(asContents) Mod 3), " ")
lsResult = ""
For lnPosition = 1 To Len(asContents) Step 3
lsGroup64 = ""
lsGroupBinary = Mid(asContents, lnPosition, 3)
Byte1 = Asc(Mid(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3
Byte2 = Asc(Mid(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15
Byte3 = Asc(Mid(lsGroupBinary, 3, 1))
Char1 = Mid(sBASE_64_CHARACTERS, ((Byte1 And 252) \ 4) + 1, 1)
Char2 = Mid(sBASE_64_CHARACTERS, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1)
Char3 = Mid(sBASE_64_CHARACTERS, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1)
Char4 = Mid(sBASE_64_CHARACTERS, (Byte3 And 63) + 1, 1)
lsGroup64 = Char1 & Char2 & Char3 & Char4
lsResult = lsResult + lsGroup64
Next
Base64encode = lsResult
End Function
Here is the C# equivalent :
public const string sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
public static string Base64encode(string asContents)
{
int lnPosition;
string lsResult;
string Char1;
string Char2;
string Char3;
string Char4;
int Byte1;
int Byte2;
int Byte3;
int SaveBits1;
int SaveBits2;
string lsGroupBinary = null;
string lsGroup64 = null;
if (Microsoft.VisualBasic.Strings.Len(asContents) % 3 > 0)
asContents = asContents + (3 - (Microsoft.VisualBasic.Strings.Len(asContents) % 3));
lsResult = "";
for (lnPosition = 1; lnPosition <= Microsoft.VisualBasic.Strings.Len(asContents); lnPosition += 3)
{
lsGroup64 = "";
lsGroupBinary = Microsoft.VisualBasic.Strings.Mid(asContents, lnPosition, 3);
Byte1 = Microsoft.VisualBasic.Strings.Asc(Microsoft.VisualBasic.Strings.Mid(lsGroupBinary, 1, 1));
SaveBits1 = Byte1 & 3;
Byte2 = Microsoft.VisualBasic.Strings.Asc(Microsoft.VisualBasic.Strings.Mid(lsGroupBinary, 2, 1));
SaveBits2 = Byte2 & 15;
Byte3 = Microsoft.VisualBasic.Strings.Asc(Microsoft.VisualBasic.Strings.Mid(lsGroupBinary, 3, 1));
Char1 = Microsoft.VisualBasic.Strings.Mid(sBASE_64_CHARACTERS, ((Byte1 & 252) / 4) + 1, 1);
Char2 = Microsoft.VisualBasic.Strings.Mid(sBASE_64_CHARACTERS, (((Byte2 & 240) / 16) | (SaveBits1 * 16) & 0xff) + 1, 1);
Char3 = Microsoft.VisualBasic.Strings.Mid(sBASE_64_CHARACTERS, (((Byte3 & 192) / 64) | (SaveBits2 * 4) & 0xff) + 1, 1);
Char4 = Microsoft.VisualBasic.Strings.Mid(sBASE_64_CHARACTERS, (Byte3 & 63) + 1, 1);
lsGroup64 = Char1 + Char2 + Char3 + Char4;
lsResult = lsResult + lsGroup64;
}
return lsResult;
}
}
What am I doing wrong?
Microsoft.VisualBasicnamespace in C#, and why can't you just use the built-in base64 conversion?Convert.ToBase64StringConvert.FromBase64String