2

Base64を使用して文字列をエンコードする必要があります。私はVB6アルゴリズムを使用しており、C#バージョンを正確に作成する必要があります。私はそれを99%正しくすることができましたが、最後の文字が間違っており、正確に何が間違っているのかわかりません。

エンコードする文字列は次のとおりです。

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

VB6エンコーディングは次の文字列を提供します。

vDnAUMqoFiGMYfhjNHb43UbjZ + / SX6MBoZjoL1t0ldT9NTZ3QnDvYwMTww4uQ / Ag

C#エンコーディングでは、次の文字列が返されます。

vDnAUMqoFiGMYfhjNHb43UbjZ + / SX6MBoZjoL1t0ldT9NTZ3QnDvYwMTww4uQ / Ax

ご覧のとおり、最後の文字を除いてすべて同じです。

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

これが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;
    }
}

私は何が間違っているのですか?

4

1 に答える 1

5

元のコードは、長さが3の整数倍になるように文字列をスペースで埋めます。翻訳されたコードは、これを適切に行いません。この行は正しく翻訳されていません:

If Len(asContents) Mod 3 > 0 Then asContents = asContents & String(3 - (Len(asContents) Mod 3), " ")

あなたはそれを持っています

if (Microsoft.VisualBasic.Strings.Len(asContents) % 3 > 0)
    asContents = asContents + (3 - (Microsoft.VisualBasic.Strings.Len(asContents) % 3));

しかし、それは

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

あなたが持っているコードは、スペースを追加する代わりに、数字を追加します。

于 2013-01-02T18:40:13.090 に答える