base64

本文介绍了一种Base64编码与解码的具体实现方式,包括如何将原始字节数据转换为Base64字符串形式及逆过程。该实现考虑了不同情况下的特殊处理,例如输入长度不是三的倍数时的填充等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

///

CHAR base64Code[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
 , 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
 , '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '='}; // ori : '+' '/' '='

BOOL Base64_EncodeA(LPBYTE pBuffer, int nBufferBytes, LPSTR lpOut, int *pnOutSize)
{
 if(pBuffer == NULL || nBufferBytes <= 0 || (lpOut == NULL && pnOutSize == NULL))
 {
  return FALSE;
 }

 int nNeededSize = ( (nBufferBytes / 3) + ((nBufferBytes % 3) ? 1 : 0) ) * 4 * sizeof(CHAR);
 nNeededSize++;
 if(lpOut == NULL)
 {
  *pnOutSize = nNeededSize;
  return TRUE;
 }

 if(pnOutSize != NULL)
 {
  if(nNeededSize > *pnOutSize)
  {
   *pnOutSize = nNeededSize;
   return FALSE;
  }
  *pnOutSize = nNeededSize;
 }
 
 int i = 0, j = 0;
 BYTE btArray_3[3], btArray_4[4];

 while (nBufferBytes--)
 {
  btArray_3[i++] = (*pBuffer++);
  if(i == 3)
  {
   btArray_4[0] = (btArray_3[0] & 0xFC) >> 2;
   btArray_4[1] = ((btArray_3[0] & 0x03) << 4) + ((btArray_3[1] & 0xF0) >> 4);
   btArray_4[2] = ((btArray_3[1] & 0x0F) << 2) + ((btArray_3[2] & 0xC0) >> 6);
   btArray_4[3] = btArray_3[2] & 0x3F;

   for(i=0; i<4; i++)
   {
    *lpOut++ = base64Code[btArray_4[i]];
   }

   i = 0;
  }
 }

 if(i != 0)
 {
  for(j=i; j<3; j++)
  {
   btArray_3[j] = 0;
  }

  btArray_4[0] = (btArray_3[0] & 0xFC) >> 2;
  btArray_4[1] = ((btArray_3[0] & 0x03) << 4) + ((btArray_3[1] & 0xF0) >> 4);
  btArray_4[2] = ((btArray_3[1] & 0x0F) << 2) + ((btArray_3[2] & 0xC0) >> 6);
  btArray_4[3] = btArray_3[2] & 0x3F;
  
  for(j=0; j<i+1; j++)
  {
   *lpOut++ = base64Code[btArray_4[j]];
  }

  while(i++ < 3)
  {
   *lpOut++ = '=';
  }

  *lpOut = '/0';
 }

 return TRUE;
}

BOOL Is_Base64A(CHAR c)
{
 return strchr(base64Code, c) != NULL;
}

int IndexOfCharA(CHAR c)
{
 LPCSTR lp = strchr(base64Code, c);
 if(lp == NULL)
 {
  return 0;
 }
 return lp - base64Code;
}

BOOL Base64_DecodeA(LPCSTR lpEncoded, LPBYTE pBuffer, int *pnBufferBytes)
{
 if(lpEncoded == NULL || strlen(lpEncoded) <= 0)
 {
  return FALSE;
 }

 int nNeededBytes = (strlen(lpEncoded) / 4) * 3;
 LPBYTE pBufferSave = pBuffer;

 int i = 0, j = 0, in_ = 0;
 BYTE btArray_4[4], btArray_3[3];

 while(lpEncoded[in_] != '/0' && lpEncoded[in_] != '=' && Is_Base64A(lpEncoded[in_]))
 {
  btArray_4[i++] = lpEncoded[in_];
  in_++;
  if(i == 4)
  {
   for(i=0; i<4; i++)
   {
    btArray_4[i] = IndexOfCharA(btArray_4[i]);
   }

   btArray_3[0] = (btArray_4[0] << 2) + ((btArray_4[1] & 0x30) >> 4);
   btArray_3[1] = ((btArray_4[1] & 0x0f) << 4) + ((btArray_4[2] & 0x3C) >> 2);
   btArray_3[2] = ((btArray_4[2] & 0x03) << 6) + btArray_4[3];

   for(i=0; i<3; i++)
   {
    *pBuffer++ = btArray_3[i];
   }
   i = 0;
  }
 }

 if(i != 0)
 {
  for(j=i; j<4; j++)
   btArray_4[j] = 0;
  for(j=0; j<4; j++)
  {
   btArray_4[j] = IndexOfCharA(btArray_4[j]);
  }

  btArray_3[0] = (btArray_4[0] << 2) + ((btArray_4[1] & 0x30) >> 4);
  btArray_3[1] = ((btArray_4[1] & 0x0f) << 4) + ((btArray_4[2] & 0x3C) >> 2);
  btArray_3[2] = ((btArray_4[2] & 0x03) << 6) + btArray_4[3];
  
  for(j=0; j<i-1; j++)
  {
   *pBuffer++ = btArray_3[j];
  }
 }

 if(pnBufferBytes != NULL)
 {
  *pnBufferBytes = pBuffer - pBufferSave;
 }

 return TRUE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值