📄 app_base64.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* app_base64.c
*
* Project:
* --------
* MAUI
*
* Description:
* ------------
* This file contains Base64 decode / encode functions.
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
*
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#include "kal_release.h"
#include "app_base64.h"
const kal_char *const app_base64_encode = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/*****************************************************************************
* FUNCTION
* applib_base64_decode
* DESCRIPTION
* This function is used to decode Base64 string.
* PARAMETERS
* src [IN] Pointer to the buffer containing encoded data
* srcl [IN] Length of the encoded data
* dest [IN/OUT] Pointer to the buffer containing decoded data
* destl [IN] Length of destination buffer Will append null character.
* RETURNS
* negative: error
* ow: Length of the decoded data (not include null character)
*****************************************************************************/
kal_int32 applib_base64_decode(kal_char *src, kal_uint32 srcl, kal_char *dest, kal_uint32 destl)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_char c, *temp_dst;
kal_char dst[APP_BASE64_BUF_LEN];
kal_uint16 e;
kal_uint32 rt = 0, num = 0, cntr;
const static kal_uint8 decode[256] =
{
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, 076, BJNK, BJNK, BJNK, 077,
064, 065, 066, 067, 070, 071, 072, 073, 074, 075, BJNK, BJNK, BJNK, BPAD, BJNK, BJNK,
BJNK, 000, 001, 002, 003, 004, 005, 006, 007, 010, 011, 012, 013, 014, 015, 016,
017, 020, 021, 022, 023, 024, 025, 026, 027, 030, 031, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, 032, 033, 034, 035, 036, 037, 040, 041, 042, 043, 044, 045, 046, 047, 050,
051, 052, 053, 054, 055, 056, 057, 060, 061, 062, 063, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK,
BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK, BJNK
};
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
/* Number of encoded bytes considered for decoding */
num = ((APP_BASE64_BUF_LEN / 3) * 4) - 4;
cntr = 0;
kal_mem_set(dst, 0, APP_BASE64_BUF_LEN);
temp_dst = (kal_char*) dst;
/* simple-minded decode */
for (e = 0; srcl--;)
{
switch (c = decode[*src++])
{
default: /* valid BASE64 data character */
switch (e++)
{ /* install based on quantum position */
case 0:
*temp_dst = c << 2;
break;
case 1:
*temp_dst++ |= c >> 4; /* byte 1: low 2 bits */
*temp_dst = c << 4; /* byte 2: high 4 bits */
break;
case 2:
*temp_dst++ |= c >> 2; /* byte 2: low 4 bits */
*temp_dst = c << 6; /* byte 3: high 2 bits */
break;
case 3:
*temp_dst++ |= c; /* byte 3: low 6 bits */
e = 0;
cntr += 4;
EXT_ASSERT(cntr <= num, cntr, num, 0);
if (cntr == num)
{
if (destl < (kal_uint32) (temp_dst - dst))
{
return -1;
}
destl -= (kal_uint32) (temp_dst - dst);
/* Copying the decoded data on to the source buffer */
kal_mem_cpy(dest + rt, dst, ((kal_char*) temp_dst - dst));
cntr = 0;
rt = rt + ((kal_char*) temp_dst - dst);
kal_mem_set(dst, 0, APP_BASE64_BUF_LEN);
temp_dst = dst; /* Reset the temp_dst pointer back to dst */
}
break;
} /* switch (e) */
break;
case BJNK: /* junk character */
break;
case BPAD: /* padding */
switch (e++)
{
case 3:
for (; srcl; --srcl)
{
switch (decode[*src++])
{
case BJNK:
case BPAD: /* ignore junk and extraneous padding */
break;
default: /* valid BASE64 data character */
if (srcl == 0)
{
if (temp_dst != dst)
{
if (destl < (kal_uint32) (temp_dst - dst))
{
return -1;
}
destl -= (kal_uint32) (temp_dst - dst);
kal_mem_cpy(dest + rt, dst, ((kal_char*) temp_dst - dst));
kal_mem_set(dst, 0, APP_BASE64_BUF_LEN);
rt = rt + ((kal_char*) temp_dst - dst);
temp_dst = dst;
}
} /* if(srcl==0) */
srcl = 1; /* don't issue any more messages */
break;
} /* switch(decode... */
} /* for */
if (srcl == 0)
{
/* When temp_dst and dst are same then
there are no decoded data present
in dst */
if (temp_dst != dst)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -