一種基于base64編碼的解碼擴展實現(xiàn)方法
【技術領域】
[0001] 本發(fā)明涉及信息安全領域,尤其涉及一種基于base64編碼的解碼擴展實現(xiàn)方法。
【背景技術】
[0002] Base64是一種常用的將數(shù)據(jù)編碼為可表示字符的編碼方法,一般在Java、C#等語 言,SDK中就有base64的編碼解碼的接口,但是有時候會因為某些原因,造成base64字符 串長度不符合要求,不能解碼。在現(xiàn)有技術中對于不完整的base64編碼只能解碼出分組 得到的完整數(shù)據(jù)組的信息,對于最后一哥不完整的數(shù)據(jù)組則無法解碼就會丟棄;而且對于 base64編碼中的錯誤字符一起解碼,無法了解base64編碼中的字符的正確性。如何將不完 整的base64編碼解碼出完整信息是現(xiàn)有技術亟待解決的問題。
【發(fā)明內(nèi)容】
[0003] 本發(fā)明的目的是為了克服現(xiàn)有技術的不足,提供一種基于base64編碼的解碼擴 展實現(xiàn)方法。
[0004] 本發(fā)明提供了一種基于base64編碼的解碼擴展實現(xiàn)方法,包括:
[0005]步驟Sl:接收編碼文本數(shù)據(jù);
[0006] 步驟S2 :按照預設長度對所述編碼文本數(shù)據(jù)進行分組,并判斷最后一個數(shù)據(jù)組是 否完整,是則執(zhí)行步驟S4,否則執(zhí)行步驟S3;
[0007] 步驟S3 :在所述最后一個數(shù)據(jù)組中補非正常數(shù)據(jù)使其完整,執(zhí)行步驟S4 ;
[0008] 步驟S4 :將第一個數(shù)據(jù)組作為當前解碼數(shù)據(jù)組;
[0009] 步驟S5 :根據(jù)當前解碼數(shù)據(jù)組獲取初步解碼字節(jié)數(shù)據(jù)組,并對所述初步解碼字節(jié) 數(shù)據(jù)組進行解碼得到解碼結(jié)果;
[0010] 步驟S6 :對當前解碼數(shù)據(jù)組進行檢查,獲得分組解碼字節(jié)數(shù),并用預設非法替換 符替換所述解碼結(jié)果中的錯誤數(shù)據(jù);
[0011] 步驟S7 :根據(jù)所述分組解碼字節(jié)數(shù)更新解碼長度,所述解碼長度初始值為0 ;
[0012] 步驟S8 :判斷所有的數(shù)據(jù)組是否都解碼完成,是則執(zhí)行步驟S9,否則將下一個數(shù) 據(jù)組作為當前解碼數(shù)據(jù)組,返回步驟S5;
[0013] 步驟S9 :返回所述解碼長度,解碼結(jié)束。
[0014] 進一步地,所述步驟S5中根據(jù)當前解碼數(shù)據(jù)組獲取初步解碼字節(jié)數(shù)據(jù)組,具體 為:
[0015] 根據(jù)所述當前解碼數(shù)據(jù)組的每個字節(jié)依次從解碼表中獲取初步解碼字節(jié)數(shù)據(jù),用 所述當前解碼數(shù)據(jù)組的每個字節(jié)所對應的初步解碼字節(jié)數(shù)據(jù)組成初步解碼字節(jié)數(shù)據(jù)組。
[0016] 進一步地,在所述步驟S5之前還包括:分別判斷當前解碼數(shù)據(jù)組中的每個字節(jié)是 否大于預設值,是則用無效標記作為對應字節(jié)的初步解碼字節(jié)數(shù)據(jù),否則執(zhí)行步驟S5。
[0017] 進一步地,在所述步驟S5中對所述初步解碼字節(jié)數(shù)據(jù)組進行解碼得到解碼結(jié)果 之前還包括:判斷所述初步解碼字節(jié)數(shù)據(jù)組中是否有可忽略的數(shù)據(jù),是則刪除所述編碼文 本數(shù)據(jù)中的對應的字符,執(zhí)行步驟S2,否則繼續(xù)。
[0018] 進一步地,判斷所述初步解碼字節(jié)數(shù)據(jù)組中是否有可忽略的數(shù)據(jù),具體為:依次判 斷初步解碼字節(jié)數(shù)據(jù)組中的初步解碼字節(jié)數(shù)據(jù)是否為預設值,是則有可忽略數(shù)據(jù),否則沒 有可忽略數(shù)據(jù)。
[0019] 進一步地,所述步驟S5中根據(jù)當前解碼數(shù)據(jù)組獲取初步解碼字節(jié)數(shù)據(jù)組,具體 為:
[0020] 步驟Pl:分別用當前解碼數(shù)據(jù)組中的每個字節(jié)與base64編碼表中的字符進行比 較,判斷能否找到匹配的字符,是則將匹配字符的序號作為對應的初步解碼字節(jié)數(shù)據(jù),執(zhí)行 步驟P4,否則執(zhí)行步驟P2;
[0021] 步驟P2 :分別判斷當前解碼數(shù)據(jù)組中的每個字節(jié)是否與預設字符匹配,是則將所 述編碼文本數(shù)據(jù)中的當前解碼字節(jié)數(shù)據(jù)忽略,返回步驟S2,否則執(zhí)行步驟P3 ;
[0022] 步驟P3 :分別判斷當前解碼數(shù)據(jù)組中的每個字節(jié)是否與結(jié)尾字符匹配,是則將與 結(jié)尾字符對應的結(jié)尾標記作為對應的初步解碼字節(jié)數(shù)據(jù),執(zhí)行步驟P4,否則用無效標記作 為對應的初步解碼字節(jié)數(shù)據(jù),執(zhí)行步驟P4 ;
[0023] 步驟P4:用所述當前解碼數(shù)據(jù)組中的每個字節(jié)所對應的初步解碼字節(jié)數(shù)據(jù)組成 初步解碼字節(jié)數(shù)據(jù)組。
[0024] 進一步地,所述步驟S2還包括:計算所述編碼文本數(shù)據(jù)的長度;
[0025] 所述判斷最后一個數(shù)據(jù)組是否完整,具體為:判斷所述編碼文本數(shù)據(jù)的長度是否 為預設長度的整數(shù)倍,是則最后一個數(shù)據(jù)組完整,否則最后一個數(shù)據(jù)組不完整。
[0026] 進一步地,所述預設長度為4字節(jié);所述步驟S5中對所述初步解碼字節(jié)數(shù)據(jù)組進 行解碼,包括:將所述4個字節(jié)的當前解碼字節(jié)數(shù)據(jù)組轉(zhuǎn)換為3字節(jié)的數(shù)據(jù)作為解碼結(jié)果。
[0027] 進一步地,所述將所述4個字節(jié)的當前解碼字節(jié)數(shù)據(jù)組轉(zhuǎn)換為3字節(jié)的數(shù)據(jù),包 括:
[0028] 步驟Yll:將所述當前解碼字節(jié)數(shù)據(jù)組中的第一字節(jié)左移2位的結(jié)果作為第一中 間結(jié)果;
[0029] 步驟Y12:將所述當前解碼字節(jié)數(shù)據(jù)組中的所述第一字節(jié)右移4位,然后再和 00000011進行與運算,將與運算的結(jié)果作為第二中間結(jié)果;
[0030] 步驟Y13 :將所述第一中間結(jié)果和所述第二中間結(jié)果進行或運算,將或運算結(jié)果 作為所述解碼結(jié)果的第一字節(jié)數(shù)據(jù);
[0031] 步驟Y14 :將所述當前解碼字節(jié)數(shù)據(jù)組中的第二字節(jié)左移4位的結(jié)果作為第三中 間結(jié)果;
[0032] 步驟Y15 :將所述當前解碼字節(jié)數(shù)據(jù)組中的第三字節(jié)右移2位,再和00001111進 行與運算,將與運算的結(jié)果作為第四中間結(jié)果;
[0033] 步驟Y16 :將所述第三中間結(jié)果和所述第四中間結(jié)果進行或運算,并將或運算的 結(jié)果作為所述解碼結(jié)果的第二字節(jié)數(shù)據(jù);
[0034] 步驟Y17 :將所述當前解碼字節(jié)數(shù)據(jù)組中的所述第三字節(jié)左移6位,結(jié)果作為第五 中間結(jié)果;
[0035] 步驟Y18 :將所述當前解碼字節(jié)數(shù)據(jù)組中的第四字節(jié)與00111111進行與運算,將 與運算的結(jié)果作為第六中間結(jié)果;
[0036] 步驟Y19 :將所述第五中間結(jié)果和所述第六中間結(jié)果進行或運算,并將或運算的 結(jié)果作為所述解碼結(jié)果的第三字節(jié)數(shù)據(jù)。
[0037] 進一步地,所述將所述4個字節(jié)的當前解碼字節(jié)數(shù)據(jù)組轉(zhuǎn)換為3字節(jié)的數(shù)據(jù),包 括:
[0038] 步驟Y21 :將整型變量初始化為0,將所述整型變量的值更新為自身左移6位的 值;
[0039] 步驟Y22 :將所述當前解碼字節(jié)數(shù)據(jù)組中的第一字節(jié)與00111111進行與運算,再 與所述整型變量的值進行或運算,并用或運算的結(jié)果替換所述整型變量的值;
[0040] 步驟Y23 :將所述整型變量的值更新為自身左移6位的值;
[0041] 步驟Y24 :將所述當前解碼字節(jié)數(shù)據(jù)組中的第二字節(jié)與00111111進行與運算,再 將與運算的結(jié)果與所述整型變量的值進行或運算,并用或運算的結(jié)果替換所述整型變量的 值;
[0042] 步驟Y25 :將所述整型變量的值更新為自身左移6位的值;
[0043] 步驟Y26 :將所述當前解碼字節(jié)數(shù)據(jù)組中的第三字節(jié)與00111111進行與運算,將 與運算的結(jié)果與所述整型變量的值進行或運算,并用或運算的結(jié)果替換所述整型變量的 值;
[0044] 步驟Y27 :將所述整型變量的值更新為自身左移6位的值;
[0045] 步驟Y28 :將所述當前解碼字節(jié)數(shù)據(jù)組中的第四字節(jié)與00111111進行與運算,將 與運算的結(jié)果與整型變量的值進行或運算,并用或運算的結(jié)果替換所述整型變量的值;
[0046] 步驟Y29 :將所述整型變量的值右移16位,將位移結(jié)果的低8位作為所述解碼結(jié) 果的第一字節(jié)數(shù)據(jù);
[0047] 步驟Y210 :將所述整型變量的值右移8位,將位移結(jié)果的低8位作為所述解碼結(jié) 果的第二字節(jié)數(shù)據(jù);
[0048] 步驟Y211 :將所述整型變量的值得低8位作為所述解碼結(jié)果的第三字節(jié)數(shù)據(jù)。
[0049] 進一步地,所述將所述4個字節(jié)的當前解碼字節(jié)數(shù)據(jù)組轉(zhuǎn)換為3字節(jié)的數(shù)據(jù),包 括:
[0050] 步驟Y31 :將整型變量初始化為0 ;
[0051] 步驟Y32 :將所述當前解碼字節(jié)數(shù)據(jù)組的第一字節(jié)與00111111進行與運算,將與 運算的結(jié)果左移18位,將移位后的結(jié)果與所述整型變量的值進行或運算,用或運算的結(jié)果 替換所述整型變量的值;
[0052] 步驟Y33 :將所述當前解碼字節(jié)數(shù)據(jù)組的第二字節(jié)與00111111進行與運算,將與 運算的結(jié)果左移12位,將移位后的結(jié)果與所述整型變量的值進行或運算,用或運算的結(jié)果 替換所述整型變量的值;