中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#怎么實現Base64編碼與解碼

發布時間:2021-08-23 17:04:49 來源:億速云 閱讀:233 作者:chen 欄目:開發技術

本篇內容介紹了“C#怎么實現Base64編碼與解碼”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、編碼規則

Base64編碼的思想是是采用64個基本的ASCII碼字符對數據進行重新編碼。它將需要編碼的數據拆分成字節數組。以3個字節為一組。按順序排列24 位數據,再把這24位數據分成4組,即每組6位。再在每組的的最高位前補兩個0湊足一個字節。這樣就把一個3字節為一組的數據重新編碼成了4個字節。當所要編碼的數據的字節數不是3的整倍數,也就是說在分組時最后一組不夠3個字節。這時在最后一組填充1到2個0字節。并在最后編碼完成后在結尾添加1到2個 “=”。

例:將對ABC進行BASE64編碼:

1、首先取ABC對應的ASCII碼值。A(65)B(66)C(67);
2、再取二進制值A(01000001)B(01000010)C(01000011);
3、然后把這三個字節的二進制碼接起來(010000010100001001000011);
4、再以6位為單位分成4個數據塊,并在最高位填充兩個0后形成4個字節的編碼后的值,(00010000)(00010100)(00001001)(00000011),其中藍色部分為真實數據;
5、再把這四個字節數據轉化成10進制數得(16)(20)(9)(3);
6、最后根據BASE64給出的64個基本字符表,查出對應的ASCII碼字符(Q)(U)(J)(D),這里的值實際就是數據在字符表中的索引。

注:BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

二、解碼規則

解碼過程就是把4個字節再還原成3個字節再根據不同的數據形式把字節數組重新整理成數據。

三、C#中的實現

編碼類:

/// <summary>
    /// Base64編碼類。
    /// 將byte[]類型轉換成Base64編碼的string類型。
    /// </summary>
    public class Base64Encoder
    {
        byte[] source;
        int length, length3;
        int blockCount;
        int paddingCount;
        public static Base64Encoder Encoder = new Base64Encoder();

        public Base64Encoder()
        {
        }

        private void init(byte[] input)
        {
            source = input;
            length = input.Length;
            if ((length % 3) == 0)
            {
                paddingCount = 0;
                blockCount = length / 3;
            }
            else
            {
                paddingCount = 3 - (length % 3);
                blockCount = (length + paddingCount) / 3;
            }
            length3 = length + paddingCount;
        }

        public string GetEncoded(byte[] input)
        {
            //初始化
            init(input);

            byte[] source2;
            source2 = new byte[length3];

            for (int x = 0; x < length3; x++)
            {
                if (x < length)
                {
                    source2[x] = source[x];
                }
                else
                {
                    source2[x] = 0;
                }
            }

            byte b1, b2, b3;
            byte temp, temp1, temp2, temp3, temp4;
            byte[] buffer = new byte[blockCount * 4];
            char[] result = new char[blockCount * 4];
            for (int x = 0; x < blockCount; x++)
            {
                b1 = source2[x * 3];
                b2 = source2[x * 3 + 1];
                b3 = source2[x * 3 + 2];

                temp1 = (byte)((b1 & 252) >> 2);

                temp = (byte)((b1 & 3) << 4);
                temp2 = (byte)((b2 & 240) >> 4);
                temp2 += temp;

                temp = (byte)((b2 & 15) << 2);
                temp3 = (byte)((b3 & 192) >> 6);
                temp3 += temp;

                temp4 = (byte)(b3 & 63);

                buffer[x * 4] = temp1;
                buffer[x * 4 + 1] = temp2;
                buffer[x * 4 + 2] = temp3;
                buffer[x * 4 + 3] = temp4;

            }

            for (int x = 0; x < blockCount * 4; x++)
            {
                result[x] = sixbit2char(buffer[x]);
            }


            switch (paddingCount)
            {
                case 0: break;
                case 1: result[blockCount * 4 - 1] = '='; break;
                case 2: result[blockCount * 4 - 1] = '=';
                    result[blockCount * 4 - 2] = '=';
                    break;
                default: break;
            }
            return new string(result);
        }
        private char sixbit2char(byte b)
        {
            char[] lookupTable = new char[64]{
                  'A','B','C','D','E','F','G','H','I','J','K','L','M',
                 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                 'a','b','c','d','e','f','g','h','i','j','k','l','m',
                 'n','o','p','q','r','s','t','u','v','w','x','y','z',
                 '0','1','2','3','4','5','6','7','8','9','+','/'};

            if ((b >= 0) && (b <= 63))
            {
                return lookupTable[(int)b];
            }
            else
            {

                return ' ';
            }
        }

    }

解碼類:

///<summary>
///Base64解碼類
///將Base64編碼的string類型轉換成byte[]類型
///</summary>
publicclassBase64Decoder
{
char[]source;
intlength,length3,length4;
intblockCount;
intpaddingCount;
publicstaticBase64DecoderDecoder=newBase64Decoder();

publicBase64Decoder()
{
}

privatevoidinit(char[]input)
{
inttemp=0;
source=input;
length=input.Length;

for(intx=0;x<2;x++)
{
if(input[length-x-1]=='=')
temp++;
}
paddingCount=temp;

blockCount=length/4;
length3=blockCount*3;
}

publicbyte[]GetDecoded(stringstrInput)
{
//初始化
init(strInput.ToCharArray());

byte[]buffer=newbyte[length];
byte[]buffer2=newbyte[length3];

for(intx=0;x<length;x++)
{
buffer[x]=char2sixbit(source[x]);
}

byteb,b1,b2,b3;
bytetemp1,temp2,temp3,temp4;

for(intx=0;x<blockCount;x++)
{
temp1=buffer[x*4];
temp2=buffer[x*4+1];
temp3=buffer[x*4+2];
temp4=buffer[x*4+3];

b=(byte)(temp1<<2);
b1=(byte)((temp2&48)>>4);
b1+=b;

b=(byte)((temp2&15)<<4);
b2=(byte)((temp3&60)>>2);
b2+=b;

b=(byte)((temp3&3)<<6);
b3=temp4;
b3+=b;

buffer2[x*3]=b1;
buffer2[x*3+1]=b2;
buffer2[x*3+2]=b3;
}

length4=length3-paddingCount;
byte[]result=newbyte[length4];

for(intx=0;x<length4;x++)
{
result[x]=buffer2[x];
}

returnresult;
}

privatebytechar2sixbit(charc)
{
char[]lookupTable=newchar[64]{
'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'};
if(c=='=')
return0;
else
{
for(intx=0;x<64;x++)
{
if(lookupTable[x]==c)
return(byte)x;
}

return0;
}

}
}
//解碼類結束

提示:

上面的代碼只是說明base64編碼的原理,以便用更多語言重寫。但.net里面可以使用更簡單的方法:
編碼:

byte[]bytes=Encoding.Default.GetBytes("要轉換的字符串");

Convert.ToBase64String(bytes);

解碼:

//"ztKwrsTj"是“我愛你”的base64編碼

byte[]outputb=Convert.FromBase64String("ztKwrsTj");

stringorgStr=Encoding.Default.GetString(outputb);

“C#怎么實現Base64編碼與解碼”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄄城县| 合川市| 平顺县| 德化县| 黑水县| 拉孜县| 阆中市| 遂溪县| 中牟县| 共和县| 万州区| 平原县| 高雄县| 海阳市| 香河县| 天柱县| 庆城县| 原平市| 吉首市| 武安市| 睢宁县| 项城市| 疏勒县| 张家口市| 桃园市| 泾川县| 且末县| 临洮县| 莲花县| 安庆市| 祁阳县| 江西省| 休宁县| 临城县| 甘德县| 永川市| 濉溪县| 大竹县| 长垣县| 台北县| 饶河县|