【C语言BASE32编码与解码的实现】

【C语言BASE32编码与解码的实现】C 语言 BASE32 编码与解码的实现 base32

大家好,欢迎来到IT知识分享网。

C语言BASE32编码与解码的实现

BASE32编码

  • 二进制数据每5位分为一组,对数据进行编码
  • 字符一个字节为8位二进制,5个字节40位二进制,编码为8组
  • 比起BASE16的4位一组一分为二编码、二合为一解码,复杂程度大大增加!!!
  • 不足5位时用0填充,用”=”来做为填充符号!!!
  • 练习位运算和移位运算非常有好处
  • 下面是由”&&&&&”转为”EYTCMJRG”的编码过程示意:
/* "&&&&&" ==> "EYTCMJRG" letter & & & & & ascii 0010 0110 0010 0110 0010 0110 0010 0110 0010 0110 base32 00100 11000 10011 00010 01100 01001 10001 00110 index 5 18 13 2 C 9 11 6 table E Y T C M J R G */ 
  • base32_encode 编码函数,代码如下:
/* filename : base32.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* compile: gcc base32.c -o base32 run: ./base32 */ // static char BT[33] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ="; /* encode txt to base32 code */ char * base32_encode (char *txt) { 
    int i = 0, j = 0, len = strlen (txt), n = (len / 5 + 1) * 8; char *buf = (char*) malloc (n * sizeof(char) + 1); memset (buf, 0, n+1); while (i < len) { 
    char c, t, x; c = txt[i]; i++; //# t = c >> 3; t = t & 0x1F; x = c & 0x07; x = x << 2; buf[j] = BT[t]; j++; //1 if (i == len) { 
    buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# t = c & 0xC0; t = t >> 6; t = t & 0x03; t = t | x; buf[j] = BT[t]; j++; //2 t = c >> 1; t = t & 0x1F; buf[j] = BT[t]; j++; //3 t = c << 4; t = t & 0x10; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0xF0; x = x >> 4; x = x & 0x0F; t = t | x; buf[j] = BT[t]; j++; //4 t = c & 0x0F; t = t << 1; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0x80; x = x >> 7; x = x & 0x01; t = t | x; buf[j] = BT[t]; j++; //5 t = c >> 2; t = t & 0x1F; buf[j] = BT[t]; j++; //6 t = c & 0x03; t = t << 3; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0xE0; x = x >> 5; x = x & 0x07; t = t | x; buf[j] = BT[t]; j++; //7 t = c & 0x1F; buf[j] = BT[t]; j++; //8 } return buf; } /* ------------------------------ */ // void test_base32_encode (void) { 
    //char *txt = "%"; //EU====== //char *txt = "%%"; //EUSQ==== //char *txt = "%%%"; //EUSSK=== //char *txt = "%%%%"; //EUSSKJI= //char *txt = "%%%%%"; //EUSSKJJF //char *txt = "%%%%%%"; //EUSSKJJFEU====== char *txt = "Hello world!"; //char *txt = "此心安处是吾乡"; char *code = base32_encode (txt); printf ("SOURCE : [%s]\n", txt); printf (" DEST : [%s]\n", code); free (code); } // int main (int argc, char *argv[]) { 
    test_base32_encode (); return 0; } /* --(.|.)-- */ 

编译运行,得到字符串的编码结果

songvm@ubuntu:~/works/xdn/woo$ gcc base32.c -o base32 songvm@ubuntu:~/works/xdn/woo$ ./base32 SOURCE : [Hello world!] DEST : [JBSWY3DPEB3W64TMMQ====] songvm@ubuntu:~/works/xdn/woo$ 
  • 编码时逐个字符进行测试,边测试边写代码!!!

BASE32解码,解码过程就是将编码过程逆向操作

  • base32_decode 解码函数,代码如下:
/* filename : base32.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* compile: gcc base32.c -o base32 run: ./base32 */ // static char BT[33] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ="; /* encode txt to base32 code */ char * base32_encode (char *txt) { 
    int i = 0, j = 0, len = strlen (txt), n = (len / 5 + 1) * 8; char *buf = (char*) malloc (n * sizeof(char) + 1); memset (buf, 0, n+1); while (i < len) { 
    char c, t, x; c = txt[i]; i++; //# t = c >> 3; t = t & 0x1F; x = c & 0x07; x = x << 2; buf[j] = BT[t]; j++; //1 if (i == len) { 
    buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# t = c & 0xC0; t = t >> 6; t = t & 0x03; t = t | x; buf[j] = BT[t]; j++; //2 t = c >> 1; t = t & 0x1F; buf[j] = BT[t]; j++; //3 t = c << 4; t = t & 0x10; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0xF0; x = x >> 4; x = x & 0x0F; t = t | x; buf[j] = BT[t]; j++; //4 t = c & 0x0F; t = t << 1; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0x80; x = x >> 7; x = x & 0x01; t = t | x; buf[j] = BT[t]; j++; //5 t = c >> 2; t = t & 0x1F; buf[j] = BT[t]; j++; //6 t = c & 0x03; t = t << 3; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0xE0; x = x >> 5; x = x & 0x07; t = t | x; buf[j] = BT[t]; j++; //7 t = c & 0x1F; buf[j] = BT[t]; j++; //8 } return buf; } /* get char index from BaseTable */ char base32_get_index (char c) { 
    for (char idx = 0; idx < 33; idx++) if (BT[idx] == c) return idx; return -1; } /* docode code to text */ char * base32_decode (char *code) { 
    int i = 0, j = 0, len = strlen (code), n = len / 8 * 5; char *buf = (char*) malloc (n * sizeof(char) + 1); memset (buf, 0, n + 1); while (i < len) { 
    char t, x, c; t = base32_get_index (code[i]); i++; t = t << 3; x = base32_get_index (code[i]); i++; c = x >> 2; c = c & 0x07; c = t | c; buf[j] = c; j++; //1 c = x << 6; t = base32_get_index (code[i]); i++; if (t == 32) { 
    buf[j] = c; j++; break; } t = t << 1; t = c | t; x = base32_get_index (code[i]); i++; c = x >> 4; c = c & 0x01; c = t | c; buf[j] = c ; j++; //2 t = base32_get_index (code[i]); i++; if (t == 32) break; c = x << 4; x = t; t = t >> 1; t = t & 0x0F; c = c | t; buf[j] = c; j++; //3 t = x << 7; x = base32_get_index (code[i]); i++; c = x << 2; c = c | t; t = base32_get_index (code[i]); i++; x = t >> 3; x = x & 0x03; c = c | x; if (t == 32) break; buf[j] = c; j++; //4 x = base32_get_index (code[i]); i++; c = t << 5; c = c | x; if (x == 32) break; buf[j] = c; j++; //5 } return buf; } /* ------------------------------ */ // void test_base32_encode (void) { 
    //char *txt = "%"; //EU====== //char *txt = "%%"; //EUSQ==== //char *txt = "%%%"; //EUSSK=== //char *txt = "%%%%"; //EUSSKJI= //char *txt = "%%%%%"; //EUSSKJJF //char *txt = "%%%%%%"; //EUSSKJJFEU====== char *txt = "Hello world!"; //char *txt = "此心安处是吾乡"; char *code = base32_encode (txt); printf ("SOURCE : [%s]\n", txt); printf (" DEST : [%s]\n", code); free (code); } // void test_base32_decode (void) { 
    //char *code = "EY======"; //& ok! //char *code = "EYTA===="; //&& ok! //char *code = "EYTCM==="; //&&& ok! //char *code = "EYTCMJQ="; //&&&& ok! //char *code = "EYTCMJRG"; //&&&&& ok! //char *code = "EYTCMJRGEY======"; //&&&&&& ok! char *code = "JBSWY3DPEB3W64TMMQ===="; //char *code = "42W2JZN7QPS25CPFUSCONGFP4WIL5ZFZUE======"; char *txt = base32_decode (code); printf (" DEST : [%s]\n", code); printf ("SOURCE : [%s]\n", txt); free (txt); } // int main (int argc, char *argv[]) { 
    test_base32_encode (); test_base32_decode (); return 0; } /* --(.|.)-- */ 

编译运行,结果如预期

songvm@ubuntu:~/works/xdn/woo$ gcc base32.c -o base32 songvm@ubuntu:~/works/xdn/woo$ ./base32 SOURCE : [Hello world!] DEST : [JBSWY3DPEB3W64TMMQ====] DEST : [JBSWY3DPEB3W64TMMQ====] SOURCE : [Hello world!] songvm@ubuntu:~/works/xdn/woo$ 

关于中文字符

  • 源码一定要用UTF8格式保存!!!
  • 右移时注意一定要去掉左侧补充的无效位,就是按与0!!!
  • 将测试函数中的中文字符串注释去掉

编译运行,结果如预期:

songvm@ubuntu:~/works/xdn/woo$ gcc base32.c -o base32 songvm@ubuntu:~/works/xdn/woo$ ./base32 SOURCE : [此心安处是吾乡] DEST : [42W2JZN7QPS25CPFUSCONGFP4WIL5ZFZUE======] DEST : [42W2JZN7QPS25CPFUSCONGFP4WIL5ZFZUE======] SOURCE : [此心安处是吾乡] songvm@ubuntu:~/works/xdn/woo$ 

文本文件的编码与解码

  • 可以将一个文本文件进行编码
  • 同样也可以将一个已编码的文本文件解码
  • 函数 test_base32_enfile (char *filename) 参数为文件名
  • 函数 test_base32_defile (char *filename) 参数为文件名

代码如下:

/* filename : base32.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* compile: gcc base32.c -o base32 run: ./base32 */ // static char BT[33] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ="; /* encode txt to base32 code */ char * base32_encode (char *txt) { 
    int i = 0, j = 0, len = strlen (txt), n = (len / 5 + 1) * 8; char *buf = (char*) malloc (n * sizeof(char) + 1); memset (buf, 0, n+1); while (i < len) { 
    char c, t, x; c = txt[i]; i++; //# t = c >> 3; t = t & 0x1F; x = c & 0x07; x = x << 2; buf[j] = BT[t]; j++; //1 if (i == len) { 
    buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# t = c & 0xC0; t = t >> 6; t = t & 0x03; t = t | x; buf[j] = BT[t]; j++; //2 t = c >> 1; t = t & 0x1F; buf[j] = BT[t]; j++; //3 t = c << 4; t = t & 0x10; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0xF0; x = x >> 4; x = x & 0x0F; t = t | x; buf[j] = BT[t]; j++; //4 t = c & 0x0F; t = t << 1; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; buf[j] = '='; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0x80; x = x >> 7; x = x & 0x01; t = t | x; buf[j] = BT[t]; j++; //5 t = c >> 2; t = t & 0x1F; buf[j] = BT[t]; j++; //6 t = c & 0x03; t = t << 3; if (i == len) { 
    x = t; buf[j] = BT[x]; j++; buf[j] = '='; j++; break; } c = txt[i]; i++; //# x = c & 0xE0; x = x >> 5; x = x & 0x07; t = t | x; buf[j] = BT[t]; j++; //7 t = c & 0x1F; buf[j] = BT[t]; j++; //8 } return buf; } /* get char index from BaseTable */ char base32_get_index (char c) { 
    for (char idx = 0; idx < 33; idx++) if (BT[idx] == c) return idx; return -1; } /* docode code to text */ char * base32_decode (char *code) { 
    int i = 0, j = 0, len = strlen (code), n = len / 8 * 5; char *buf = (char*) malloc (n * sizeof(char) + 1); memset (buf, 0, n + 1); while (i < len) { 
    char t, x, c; t = base32_get_index (code[i]); i++; t = t << 3; x = base32_get_index (code[i]); i++; c = x >> 2; c = c & 0x07; c = t | c; buf[j] = c; j++; //1 c = x << 6; t = base32_get_index (code[i]); i++; if (t == 32) { 
    buf[j] = c; j++; break; } t = t << 1; t = c | t; x = base32_get_index (code[i]); i++; c = x >> 4; c = c & 0x01; c = t | c; buf[j] = c ; j++; //2 t = base32_get_index (code[i]); i++; if (t == 32) break; c = x << 4; x = t; t = t >> 1; t = t & 0x0F; c = c | t; buf[j] = c; j++; //3 t = x << 7; x = base32_get_index (code[i]); i++; c = x << 2; c = c | t; t = base32_get_index (code[i]); i++; x = t >> 3; x = x & 0x03; c = c | x; if (t == 32) break; buf[j] = c; j++; //4 x = base32_get_index (code[i]); i++; c = t << 5; c = c | x; if (x == 32) break; buf[j] = c; j++; //5 } return buf; } /* ------------------------------ */ // void test_base32_encode (void) { 
    //char *txt = "%"; //EU====== //char *txt = "%%"; //EUSQ==== //char *txt = "%%%"; //EUSSK=== //char *txt = "%%%%"; //EUSSKJI= //char *txt = "%%%%%"; //EUSSKJJF //char *txt = "%%%%%%"; //EUSSKJJFEU====== //char *txt = "Hello world!"; char *txt = "此心安处是吾乡"; char *code = base32_encode (txt); printf ("SOURCE : [%s]\n", txt); printf (" DEST : [%s]\n", code); free (code); } // void test_base32_decode (void) { 
    //char *code = "EY======"; //& ok! //char *code = "EYTA===="; //&& ok! //char *code = "EYTCM==="; //&&& ok! //char *code = "EYTCMJQ="; //&&&& ok! //char *code = "EYTCMJRG"; //&&&&& ok! //char *code = "EYTCMJRGEY======"; //&&&&&& ok! //char *code = "JBSWY3DPEB3W64TMMQ===="; char *code = "42W2JZN7QPS25CPFUSCONGFP4WIL5ZFZUE======"; char *txt = base32_decode (code); printf (" DEST : [%s]\n", code); printf ("SOURCE : [%s]\n", txt); free (txt); } /* encode a file and output */ void test_base32_enfile (char *filename) { 
    int i = 0, p = 0; char c, buf[161] = { 
   0}; FILE *fpi; fpi = fopen (filename, "r"); if (fpi == NULL) { 
    fprintf (stderr, "Error: open file %s error!\n", filename); return ; } c = fgetc (fpi); while (c != EOF) { 
    buf[i] = c; i++; if (i == 160) { 
    i = 0; p++; char *cbuf = base32_encode (buf); printf ("%s", cbuf); free (cbuf); memset (buf, 0, 161); } c = fgetc (fpi); } if (i < 161) { 
    char *cbuf = base32_encode (buf); printf ("%s", cbuf); free (cbuf); } printf ("\n"); fclose (fpi); } /* decode a file and output */ void test_base32_defile (char *filename) { 
    char c, buf[161] = { 
   0}; int i = 0, p = 0; FILE *fpi = fopen (filename, "r"); if (fpi == NULL) { 
    fprintf (stderr, "Error: open file %s error!\n", filename); return ; } c = fgetc (fpi); while (c != EOF) { 
    buf[i] = c; i++; if (i == 160) { 
    i = 0; p++; char *cbuf = base32_decode (buf); printf ("%s", cbuf); memset (buf, 0, 161); free (cbuf); } c = fgetc (fpi); } if (i < 161) { 
    char *cbuf = base32_decode (buf); printf ("%s", cbuf); free (cbuf); } printf ("\n"); fclose (fpi); } // int main (int argc, char *argv[]) { 
    //test_base32_encode (); //test_base32_decode (); test_base32_enfile ("boo.txt"); //test_base32_defile ("bar.txt"); return 0; } /* --(.|.)-- */ 

从网页上复制了一段新闻,保存到boo.txt文件中,编译运行,结果如下:

songvm@ubuntu:~/works/xdn/woo$ gcc base32.c -o base32 songvm@ubuntu:~/works/xdn/woo$ ./base32 42LLBZMNR3T2JPXFRSL6JOVMGEYONHEIHDTJPJPHSS267PEI5CXLB2EAQXSYNL7GVWDOPBFW4OAIDZMITDTJ3KHPXSE6LJEW4S5KJ2MDVDSY7EPIVCAOJOV242XZXZNOQE4ONF5F5CQ2RZ5EXLX3ZDHCQCOOJOFN4WN33ZVYXDRIBHPHTKCOLDMH424KT354RTTJRPXHUS5OJOUG4S4K3ZM3XXTZVBHFSC4OLPEV4WFJXZMSRTS3ZAHGSS7OLJ5742AIDY4AQLTKZIXIX6HONG5U4WSJVZNES3SZXPPGTSF6LD4L42O2LZMNR3TJPBPIUGGO7PEM42WKH2FVR7T35DXEXC66LMNR42ZLH354RTTIJH7HT6S6TLMF4WFJXZFYVXSZXPPDQCBAVZN5SPTJPJPEX2F6RIMM5CXLB2EAQXSLZGXEXCFO7PEM42OIT2FOWDUIBBPJS6XO7PE24WSJVZNOW3TJPBPGXC4OLONT4WH3BZUVWDTI3LXGTC7OPJF2566IZYUATTSY3APEXCAOFAE54WAYPZU4T7TJZH7JS62O7PEM4WC2LZNCQPTLROHIV2ROLDMV5GDY7ZMQRTTK7FHFUKPOTFN74WC23ZUISDS3PJXFR6Z67PEM5CXLRZNETLSZ7DXFXCBONCEQ4S4LVZNES3SZXPPGXC4OLLVC46NIJZ4DVXUZPKHHTOXOPGUE4WOLBY4AQLTIREPEXOWOJOM742Z2RZUER7SYRMHPXSGORP4R42OJ7ZNES3SLVJHJQOUOPLMJ46N3RZMFWPUYHKHJS6UONDEB46523ZMHXLSY7MHFUSLOLG554S5LVZMFUXS2FA7EX276LCFJ4WGJNZUOVLTJNPPDQCBOLD4R5CUIBZF2XLTJZCPEXWK6RP434S4IBZVNUXUK7BHIV25O7PE7BLTK7G7FV2A6RINI46SLV354RTRIBHHEXCW6LG55424LRYUATXTZVBHFRWD6NOFJ566IZZUYX3T2JOXEXKDOJOFN4WN33Z42QTSZBOHFXSK6LCU34WJIZZN4QDTJJPXFU676NAEB4OAIFZFYVXSZXPPFW6ZOLEEMGI2OJOFK4WN33ZNOW3S25HXHR2YOLBNI5GO2FZF2SLSYLDPHVW7ORL4B566IZZNPXEYTNZFYVLSZXPPFV23OLLU65CQYZZMFRXT23PXFQWS6LIUD42KL7Z5NS3X3ZDHFV64TKNHEXCVOLG554WXLNZNOT3UKDDBXGLS3BD7GS63ONCEWGE2DJZNQR7TJPNXIX6D6LIUD4WCY3Z5NX3X3ZDHFUSLOLG55424LRZNOULTJ3JPFRWHONNMB46UIXZFYRXTJNLPHV2AOLDEW566IZZM4VDSY3DXEXWJ6TKUM4S4I3ZUWVXSLZGHFRSLOHAECBLRIBHHGRWXONCER4S5IN2FHUPX3ZDHFRSL6JOVM42HKRZMHXLSLVBXDQCFOLIUD4WSJNZMITXTKZIPGTWS6JOVM4S5LVZMRTDSZ7DXFXCBONHEN4WFKDZUMQ7SY3F7DQCF67PEM46Z3XZ53T7TI7EHEX2N6LEEE46Y3XZ4UT7TLJO7GTSG6LCVB4S72DZUBV7RYBAXEXCFONNNX4WOKRZMHXLT2PH7IXWTOLEUM4WOLB2MTQHT2XGPJQWG6LJEH4WSJNZMNUHTJJL7EXOMORLV64WSIPY4AQLTIREHJQO66HAEB5CS37ZNORHT23CJY4S4KVZM7R3S3RAXGVWR6RL4V46BLTZF6X7SYRKPGTWS6LDMO4S5LVZMRTDTJJL7EXOMOPGUE42LLBZFYX3TI5KXDQCBOFAE542XZXZNOQHUK7NHDQCBAVZVPTPS25APIUGUOPJF2566IZZFYVXSZXPPFXSAONFF646NIJZNEU7UZPKHEXSNORNUK4W6IB2FWRLS2JJ7PXSGOLB524WC2LZNCQPSL5P7FRCU6LDEW42YLJZNZWPSLZGXEXCG6NFVN42HZBZMNQ7RYBAXGVSRORP4O42N3JZNETLS2JFXFTO66NHEL4WHYXZU5UXSY3DXGS6C6RIMM566IZZVMUPULLD7HX2HOJOF54WY3DZVSWPX3ZDHGQSP6PH5F5GWYLZMKTPSLRLPFTO66HAECBI====== songvm@ubuntu:~/works/xdn/woo$ 

将上面的结果复制到bar.txt文件中,将test_base32_defile (“bar.txt”);函数注释打开,把上一行注释掉,编译运行,结果如下:

songvm@ubuntu:~/works/xdn/woo$ gcc base32.c -o base32 songvm@ubuntu:~/works/xdn/woo$ ./base32 新华社北京10月8日电(记者冯歆然、刘杨)外交部发言人毛宁8日表示,“中国游”的升温,显示了中国的吸引力和开放姿态。欢迎更多外国朋友来华旅行,欣赏美丽山河,感知魅力中国。 当日例行记者会上,有记者问:多家旅游平台数据显示,“十一”假期期间,入境游订单量同比增长六成左右,许多城市成为外国游客的热门目的地。我们也注意到,近期外交部等相关部门持续出台外国人入境便利化措施。发言人有何进一步评论? 毛宁表示,“中国游”的升温,显示了中国的吸引力和开放姿态。中国已同24个国家实现全面互免签证,对16个国家实行免签入境政策,对54个国家实行72小时或144小时过境免签,外国游客来华流程不断简化,在华体验不断优化。 “据我了解,北京推出了《境外初次来京人员城市服务指南》,系统提供各类生活服务信息。上海在出租车和地铁站配备外卡支付设备。成都、西安等8个城市正试点便利来华人员支付的新举措。”毛宁说。 毛宁表示,中国开放的大门会越开越大,出入境便利化水平会不断提升。欢迎更多外国朋友来华旅行,欣赏美丽山河,感知魅力中国。 songvm@ubuntu:~/works/xdn/woo$ 
  • 达到预期目标,下一步研究BASE64编码与解码!!!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125812.html

(0)
上一篇 2025-09-23 21:45
下一篇 2025-09-23 22:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信