第十二章 BASE64编解码 / 12.4 编程示例

1)    示例1

       #include <string.h>

       #include <openssl/evp.h>

       int    main()

       {

              EVP_ENCODE_CTX     ectx,dctx;

              unsigned charin[500],out[800],d[500];

              int           inl,outl,i,total,ret,total2;

             

              EVP_EncodeInit(&ectx);

              for(i=0;i<500;i++)

                     memset(&in[i],i,1);

              inl=500;

              total=0;

              EVP_EncodeUpdate(&ectx,out,&outl,in,inl);

              total+=outl;

              EVP_EncodeFinal(&ectx,out+total,&outl);

              total+=outl;

              printf("%s\n",out);

      

              EVP_DecodeInit(&dctx);

              outl=500;

              total2=0;

              ret=EVP_DecodeUpdate(&dctx,d,&outl,out,total);

              if(ret<0)

              {

                     printf("EVP_DecodeUpdate err!\n");

                     return -1;

              }

              total2+=outl;

              ret=EVP_DecodeFinal(&dctx,d,&outl);

              total2+=outl;

              return 0;

       }

       本例中先编码再解码。

       编码调用次序为EVP_EncodeInitEVP_EncodeUpdate(可以多次)EVP_EncodeFinal

       解码调用次序为EVP_DecodeInitEVP_DecodeUpdate(可以多次)EVP_DecodeFinal

       注意:采用上述函数BASE64编码的结果不在一行,解码所处理的数据也不在一行。用上述函数进行BASE64编码时,输出都是格式化输出。特别需要注意的是,BASE64解码时如果某一行字符格式超过80个,会出错。如果要BASE64编码的结果不是格式化的,可以直接调用函数:EVP_EncodeBlock。同样对于非格式化数据的BASE64解码可以调用EVP_DecodeBlock函数,不过用户需要自己去除后面填充的0

       2)    示例2

       #include <string.h>

       #include <openssl/evp.h>

       int    main()

       {

              unsigned charin[500],out[800],d[500],*p;

              int                         inl,i,len,pad;

             

              for(i=0;i<500;i++)

                     memset(&in[i],i,1);

              printf("please input how much(<500) to base64 : \n");

              scanf("%d",&inl);

              len=EVP_EncodeBlock(out,in,inl);

              printf("%s\n",out);

              p=out+len-1;

              pad=0;

              for(i=0;i<4;i++)

              {

                     if(*p=='=')

                            pad++;

                     p--;

              }

              len=EVP_DecodeBlock(d,out,len);

              len-=pad;

              if((len!=inl) || (memcmp(in,d,len)))

                     printf("err!\n");

              printf("test ok.\n");

              return 0;

       }