⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apr_base64.c

📁 本人收集整理的一份c/c++跨平台网络库
💻 C
字号:
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as * applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* base64 encoder/decoder. Originally part of main/util.c * but moved here so that support/ab and apr_sha1.c could * use it. This meant removing the apr_palloc()s and adding * ugly 'len' functions, which is quite a nasty cost. */#include "apr_base64.h"#if APR_CHARSET_EBCDIC#include "apr_xlate.h"#endif				/* APR_CHARSET_EBCDIC *//* aaaack but it's fast and const should make it shared text page. */static const unsigned char pr2six[256] ={#if !APR_CHARSET_EBCDIC    /* ASCII table */    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,    64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64#else /*APR_CHARSET_EBCDIC*/    /* EBCDIC table */    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,    64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,    64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,    64,  0,  1,  2,  3,  4,  5,  6,  7,  8, 64, 64, 64, 64, 64, 64,    64,  9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,    64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64#endif /*APR_CHARSET_EBCDIC*/};#if APR_CHARSET_EBCDICstatic apr_xlate_t *xlate_to_ebcdic;static unsigned char os_toascii[256];APU_DECLARE(apr_status_t) apr_base64init_ebcdic(apr_xlate_t *to_ascii,                                             apr_xlate_t *to_ebcdic){    int i;    apr_size_t inbytes_left, outbytes_left;    apr_status_t rv;    int onoff;        /* Only single-byte conversion is supported.     */    rv = apr_xlate_get_sb(to_ascii, &onoff);    if (rv) {        return rv;    }    if (!onoff) { /* If conversion is not single-byte-only */        return APR_EINVAL;    }    rv = apr_xlate_get_sb(to_ebcdic, &onoff);    if (rv) {        return rv;    }    if (!onoff) { /* If conversion is not single-byte-only */        return APR_EINVAL;    }    xlate_to_ebcdic = to_ebcdic;    for (i = 0; i < sizeof(os_toascii); i++) {        os_toascii[i] = i;    }    inbytes_left = outbytes_left = sizeof(os_toascii);    apr_xlate_conv_buffer(to_ascii, os_toascii, &inbytes_left,                          os_toascii, &outbytes_left);    return APR_SUCCESS;}#endif /*APR_CHARSET_EBCDIC*/APU_DECLARE(int) apr_base64_decode_len(const char *bufcoded){    int nbytesdecoded;    register const unsigned char *bufin;    register int nprbytes;    bufin = (const unsigned char *) bufcoded;    while (pr2six[*(bufin++)] <= 63);    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;    nbytesdecoded = ((nprbytes + 3) / 4) * 3;    return nbytesdecoded + 1;}APU_DECLARE(int) apr_base64_decode(char *bufplain, const char *bufcoded){#if APR_CHARSET_EBCDIC    apr_size_t inbytes_left, outbytes_left;#endif				/* APR_CHARSET_EBCDIC */    int len;        len = apr_base64_decode_binary((unsigned char *) bufplain, bufcoded);#if APR_CHARSET_EBCDIC    inbytes_left = outbytes_left = len;    apr_xlate_conv_buffer(xlate_to_ebcdic, bufplain, &inbytes_left,                          bufplain, &outbytes_left);#endif				/* APR_CHARSET_EBCDIC */    bufplain[len] = '\0';    return len;}/* This is the same as apr_base64_decode() except on EBCDIC machines, where * the conversion of the output to ebcdic is left out. */APU_DECLARE(int) apr_base64_decode_binary(unsigned char *bufplain,				   const char *bufcoded){    int nbytesdecoded;    register const unsigned char *bufin;    register unsigned char *bufout;    register int nprbytes;    bufin = (const unsigned char *) bufcoded;    while (pr2six[*(bufin++)] <= 63);    nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;    nbytesdecoded = ((nprbytes + 3) / 4) * 3;    bufout = (unsigned char *) bufplain;    bufin = (const unsigned char *) bufcoded;    while (nprbytes > 4) {	*(bufout++) =	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);	*(bufout++) =	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);	*(bufout++) =	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);	bufin += 4;	nprbytes -= 4;    }    /* Note: (nprbytes == 1) would be an error, so just ingore that case */    if (nprbytes > 1) {	*(bufout++) =	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);    }    if (nprbytes > 2) {	*(bufout++) =	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);    }    if (nprbytes > 3) {	*(bufout++) =	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);    }    nbytesdecoded -= (4 - nprbytes) & 3;    return nbytesdecoded;}static const char basis_64[] =    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";APU_DECLARE(int) apr_base64_encode_len(int len){    return ((len + 2) / 3 * 4) + 1;}APU_DECLARE(int) apr_base64_encode(char *encoded, const char *string, int len){#if !APR_CHARSET_EBCDIC    return apr_base64_encode_binary(encoded, (const unsigned char *) string, len);#else /* APR_CHARSET_EBCDIC */    int i;    char *p;    p = encoded;    for (i = 0; i < len - 2; i += 3) {	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];	*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |	                ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];	*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) |	                ((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];	*p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];    }    if (i < len) {	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];	if (i == (len - 1)) {	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4)];	    *p++ = '=';	}	else {	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |	                    ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];	    *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];	}	*p++ = '=';    }    *p++ = '\0';    return p - encoded;#endif				/* APR_CHARSET_EBCDIC */}/* This is the same as apr_base64_encode() except on EBCDIC machines, where * the conversion of the input to ascii is left out. */APU_DECLARE(int) apr_base64_encode_binary(char *encoded,                                      const unsigned char *string, int len){    int i;    char *p;    p = encoded;    for (i = 0; i < len - 2; i += 3) {	*p++ = basis_64[(string[i] >> 2) & 0x3F];	*p++ = basis_64[((string[i] & 0x3) << 4) |	                ((int) (string[i + 1] & 0xF0) >> 4)];	*p++ = basis_64[((string[i + 1] & 0xF) << 2) |	                ((int) (string[i + 2] & 0xC0) >> 6)];	*p++ = basis_64[string[i + 2] & 0x3F];    }    if (i < len) {	*p++ = basis_64[(string[i] >> 2) & 0x3F];	if (i == (len - 1)) {	    *p++ = basis_64[((string[i] & 0x3) << 4)];	    *p++ = '=';	}	else {	    *p++ = basis_64[((string[i] & 0x3) << 4) |	                    ((int) (string[i + 1] & 0xF0) >> 4)];	    *p++ = basis_64[((string[i + 1] & 0xF) << 2)];	}	*p++ = '=';    }    *p++ = '\0';    return p - encoded;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -