VB6的C#版Base64编码

Inv*_*Dev 2 c# vb6 base64 encoding

我需要使用Base64对字符串进行编码.我有一个VB6算法,我需要准确编写一个C#版本.我能够把它弄好99%,但最后一个角色是错的,我不确定到底出了什么问题.

这是要编码的字符串:

¼9ÀPʨ!Œaøc4vøÝFãgïÒ_£¡到e/[T•Ôý56wBpïcÃ.Cð`

VB6编码提供以下字符串:

vDnAUMqoFiGMYfhjNHb43UbjZ +/SX6MBoZjoL1t0ldT9NTZ3QnDvYwMTww4uQ /银

C#编码提供以下字符串:

vDnAUMqoFiGMYfhjNHb43UbjZ +/SX6MBoZjoL1t0ldT9NTZ3QnDvYwMTww4uQ /斧

正如你所看到的,除了最后一个字母外,一切都是一样的.

VB6算法:

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
Run Code Online (Sandbox Code Playgroud)

这是C#等价物:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

prp*_*fee 5

原始代码用空格填充字符串,使得长度是3的整数倍.翻译的代码不能正确地执行此操作.此行未正确翻译:

If Len(asContents) Mod 3 > 0 Then asContents = asContents & String(3 - (Len(asContents) Mod 3), " ")
Run Code Online (Sandbox Code Playgroud)

你有它

if (Microsoft.VisualBasic.Strings.Len(asContents) % 3 > 0)
    asContents = asContents + (3 - (Microsoft.VisualBasic.Strings.Len(asContents) % 3));
Run Code Online (Sandbox Code Playgroud)

但它应该是

if (Microsoft.VisualBasic.Strings.Len(asContents) % 3 > 0)
    asContents = asContents + Microsoft.VisualBasic.Strings.String(3 - (Microsoft.VisualBasic.Strings.Len(asContents) % 3), " ");
Run Code Online (Sandbox Code Playgroud)

您拥有的代码不会附加空格,而是附加一个数字.

  • 需要注意的是,如果你想通过重复某个字符来构造一个字符串,那么`string`的一个构造函数就是这样做的. (2认同)
  • +1.@InvisibleDev,简单的String.Length在你的情况下应该是完全足够的,添加空格可以通过`new String('',3)`来完成,而不是使用普通的`ConvertToBase64`调用 - 更短更安全...... (2认同)