Base64编码解码程序(C语言版)

#include <stdio.h>
#include <windows.h>
//
//Base64 编码
int Base64Encode( char *OrgString, char *Base64String, int OrgStringLen )
{
// OrgString 待编码字符串指针
// Base64String 保存编码结果字符串指针
// OrgStringLen 待编码字符串长度
static char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int Base64StringLen = 0;

while( OrgStringLen > 0 )
{
   *Base64String ++ = Base64Encode[(OrgString[0] >> 2 ) & 0x3f];
   if( OrgStringLen > 2 )
   {
*Base64String ++ = Base64Encode[((OrgString[0] & 3) << 4) | (OrgString[1] >> 4)];
*Base64String ++ = Base64Encode[((OrgString[1] & 0xF) << 2) | (OrgString[2] >> 6)];
*Base64String ++ = Base64Encode[OrgString[2] & 0x3F];
   }
   else
   {
switch( OrgStringLen )
{
case 1:
*Base64String ++ = Base64Encode[(OrgString[0] & 3) << 4 ];
*Base64String ++ = '=';
*Base64String ++ = '=';
break;
case 2:
*Base64String ++ = Base64Encode[((OrgString[0] & 3) << 4) | (OrgString[1] >> 4)];
*Base64String ++ = Base64Encode[((OrgString[1] & 0x0F) << 2) | (OrgString[2] >> 6)];
*Base64String ++ = '=';
break;
}
   }
  
   OrgString +=3;
   OrgStringLen -=3;
   Base64StringLen +=4;
}

*Base64String = 0;
return Base64StringLen;
}
//
//Base64 解码
char GetBase64Value(char ch) //得到编码值
{
if ((ch >= 'A') && (ch <= 'Z'))   // A ~ Z
   return ch - 'A';
if ((ch >= 'a') && (ch <= 'z'))   // a ~ z
   return ch - 'a' + 26;
if ((ch >= '0') && (ch <= '9'))   // 0 ~ 9
   return ch - '0' + 52;
switch (ch)    // 其它字符
{
case '+':
   return 62;
case '/':
   return 63;
case '=':   //Base64 填充字符
   return 0;
default:
   return 0;
}
}
// 解码函数
int Base64Decode( char *OrgString, char *Base64String, int Base64StringLen, bool bForceDecode )   //解码函数
{
// OrgString 保存解码结果字符串指针
// Base64String 待解码字符串指针
// Base64StringLen 待解码字符串长度
// bForceDecode 当待解码字符串长度错误时,是否强制解码
//     true   强制解码
//     false 不强制解码
if( Base64StringLen % 4 && !bForceDecode ) //如果不是 4 的倍数,则 Base64 编码有问题
{
   OrgString[0] = '/0';
   return -1;
}
unsigned char Base64Encode[4];
int OrgStringLen=0;

while( Base64StringLen > 2 )   //当待解码个数不足3个时,将忽略它(强制解码时有效)
{
   Base64Encode[0] = GetBase64Value(Base64String[0]);
   Base64Encode[1] = GetBase64Value(Base64String[1]);
   Base64Encode[2] = GetBase64Value(Base64String[2]);
   Base64Encode[3] = GetBase64Value(Base64String[3]);
  
   *OrgString ++ = (Base64Encode[0] << 2) | (Base64Encode[1] >> 4);
   *OrgString ++ = (Base64Encode[1] << 4) | (Base64Encode[2] >> 2);
   *OrgString ++ = (Base64Encode[2] << 6) | (Base64Encode[3]);
  
   Base64String += 4;
   Base64StringLen -= 4;
   OrgStringLen += 3;
}

return OrgStringLen;
}
//Base64 函数完毕
//
void main()
{
char OrgString[] = "adly";
char Base64String[30];
int OrgStringLen = strlen( OrgString );
int Base64StringLen = Base64Encode( OrgString, Base64String, OrgStringLen );
printf( "Base64Encode: %s (%d)/n", Base64String, Base64StringLen );
OrgStringLen = Base64Decode( OrgString, Base64String, Base64StringLen, true );
printf( "Base64Decode: %s (%d)/n", OrgString, OrgStringLen );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值