Base64 Is based on 64 Printable characters to represent the representation of binary data. Because 26 = 64 , So every 6 It is a unit that corresponds to a printable character. Three bytes in total 24 Bit, corresponding 4 Items Base64 Unit, that is 3 Bytes 4 Printable characters. It is often used as the transmission code of emails. In Base64 The printable characters include uppercase letters.A-Z , Lowercase letters A-z Arabic numerals 0-9 . 62 Characters, and the two printable symbols are different in different systems. Generally, the plus sign ( + ) And forward slash ( / ). Plus the "completion symbol", usually with the equal sign ( = ).
complete base64 definition visibility RFC 1421 and RFC 2045 . The encoded data is slightly longer than the original data, which is the original 4/3 . In the email, according to RFC 822 , each 76 character must contain a carriage return and line break. It can be estimated that the length of the encoded data is about 135.1% .
Base64When encoding, put three pieces of data into one24In the buffer, the first-come buffer occupies a high position. Insufficient data3Bytes, the remaining bits in the buffer are used0Complement. Then, retrieve 6 at a time (because26 = 64) Bit, select according to its valueAbcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789 +/As the encoded output. Continue until all input data is converted. If the last two inputs are left, add one"="; If the last input data is left, the encoding result is followed by two"="; If there is no data left, do not add anything. This ensures the correctness of data restoration.
CLanguageSource codeAs follows:
/* ** Base64 encoding and decoding implementation * C language sourceCode** Ye Jianfei ** instructions for use: * command line parameter description: if the "-d" parameter exists, it is base64 decoded; otherwise, it is base64 encoded. * The input comes from the standard input stdin, and the output is the standard output stdout. You can redirect input and output streams. ** Base64 encoding: enter any binary stream and read it until the file is fully read (the keyboard input ends with a file Terminator ). * Outputs the base64 encoding of plain text. ** Base64 decoding: base64 encoding of the input plain text. It can be read until the file is fully read (the keyboard input ends with a file Terminator ). * Output the original binary stream. * */ # Include <Stdio. h> # Include <Stdlib. h> # Include <String. h> Const Char * Base64char = " Abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789 +/ " ; Char * Base64_encode ( Const Unsigned Char * Bindata, Char * Base64, Int Binlength ){ Int I, J; unsigned Char Current; For (I =0 , J = 0 ; I <binlength; I + = 3 ) {Current = (Bindata [I]> 2 ); Current & = (Unsigned Char ) 0x3f ; Base64 [J ++] = Base64char [( Int ) Current]; Current = (Unsigned Char ) (Bindata [I] <4 ) & (Unsigned Char ) 0x30 ); If (I + 1 > = Binlength) {base64 [J ++] = Base64char [( Int ) Current]; base64 [J ++] = ' = ' ; Base64 [J ++] =' = ' ; Break ;} Current | = (Unsigned Char ) (Bindata [I + 1 ]> 4 ) & (Unsigned Char ) 0x0f ); Base64 [J ++] = Base64char [( Int ) Current]; Current = (Unsigned Char ) (Bindata [I + 1 ] < 2 ) & (Unsigned Char ) 0x3c ); If (I + 2 > = Binlength) {base64 [J ++] = Base64char [( Int ) Current]; base64 [J ++] = ' = ' ; Break ;} Current | = (Unsigned Char ) (Bindata [I + 2 ]> 6 ) & (Unsigned Char ) 0x03 ); Base64 [J ++] = Base64char [( Int ) Current]; Current = (Unsigned Char ) Bindata [I +2 ]) & (Unsigned Char ) 0x3f ); Base64 [J ++] = Base64char [( Int ) Current];} base64 [J] = ' \ 0 ' ; Return Base64 ;} Int Base64_decode ( Const Char * Base64, unsigned Char * Bindata ){ Int I, J; unsigned Char K; unsigned Char Temp [ 4 ]; For (I = 0 , J = 0 ; Base64 [I]! = ' \ 0 ' ; I + = 4 ) {Memset (temp, 0xff , Sizeof (Temp )); For (K = 0 ; K < 64 ; K ++ ){ If (Base64char [k] = Base64 [I]) temp [ 0 ] = K ;} For (K = 0 ; K < 64 ; K ++ ){ If (Base64char [k] = base64 [I + 1 ]) Temp [ 1 ] = K ;} For (K = 0 ; K < 64 ; K ++ ){ If (Base64char [k] = base64 [I + 2 ]) Temp [ 2 ] = K ;} For (K = 0 ; K < 64 ; K ++ ){ If (Base64char [k] = base64 [I + 3 ]) Temp [ 3 ] =K;} bindata [J ++] = (Unsigned Char ) (Unsigned Char ) (Temp [ 0 ] < 2 ))& 0xfc ) | (Unsigned Char ) (Unsigned Char ) (Temp [ 1 ]> 4 )& 0x03 )); If (Base64 [I + 2 ] = ' = ' ) Break ; Bindata [J ++] = (Unsigned Char ) (Unsigned Char ) (Temp [ 1 ] < 4 ))& 0xf0 ) | (Unsigned Char ) (Unsigned Char ) (Temp [ 2 ]> 2 )& 0x0f )); If (Base64 [I + 3 ] = ' = ' ) Break ; Bindata [J ++] = (UnsignedChar ) (Unsigned Char ) (Temp [ 2 ] < 6 ))& 0xf0 ) | (Unsigned Char ) (Temp [ 3 ] & 0x3f ));} Return J ;} Int Main ( Int Argc,Char * Argv []) { Int I; unsigned Char Bindata [ 2050 ]; Char Base64 [ 4096 ]; Size_t bytes; If (Argc = 1 ){ // Encode While (! Feof (stdin) {bytes = Fread (bindata, 1 , 2049 , Stdin); base64_encode (bindata, base64, bytes); printf ( " % S " , Base64 );}} Else If (Argc = 2 &&! Strcmp (argv [ 1 ]," -D " )){ // Decode While (! Feof (stdin )){ For (I = 0 ; I < 2048 ; I ++ ) {Base64 [I] = Getchar (); If (Base64 [I] =EOF) Break ; Else If (Base64 [I] = ' \ N ' | Base64 [I] = ' \ R ' ) I -- ;} Bytes = Base64_decode (base64, bindata); fwrite (bindata, bytes, 1 , Stdout );}} Else {Fprintf (stderr, " Usage: % s [-D] \ n \ t-d \ tdecode data \ n " , Argv [ 0 ]); Return Exit_failure ;} Return Exit_success ;}