#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <stdint.h>
#include <time.h>
#include "ga.h"
#pragma warning(disable:4996)
// typedef unsigned int size_t;
// typedef int ptrdiff_t;
// typedef int intptr_t;
/****************************** Base32 Encoding ******************************/
static const size_t BASE32_ENCODE_INPUT = 5;
static const size_t BASE32_ENCODE_OUTPUT = 8;
static const char* const BASE32_ENCODE_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=";
//返回输出缓冲区需要的大小
size_t base32EncodeGetLength(size_t size)
{
/*
* output 8 bytes for every 5 input:
* 1 2 3 4 5
* 1 = ---11111 = 11111---
* 2 = ---111XX = -----111 XX------
* 3 = ---11111 = --11111-
* 4 = ---1XXXX = -------1 XXXX----
* 5 = ---1111X = ----1111 X-------
* 6 = ---11111 = -11111--
* 7 = ---11XXX = ------11 XXX-----
* 8 = ---11111 = ---11111
*/
return (((size + BASE32_ENCODE_INPUT - 1) / BASE32_ENCODE_INPUT) * BASE32_ENCODE_OUTPUT) + 1; /*plus terminator*/
}
//base32编码,size是src字符串的长度不包括结尾的'\0'
size_t base32Encode(char* dest, const void* src, size_t size)
{
if (dest && src)
{
unsigned char* pSrc = (unsigned char*)src;
size_t dwSrcSize = size;
size_t dwDestSize = 0;
size_t dwBlockSize;
unsigned char n1, n2, n3, n4, n5, n6, n7, n8;
while (dwSrcSize >= 1)
{
/* Encode inputs */
dwBlockSize = (dwSrcSize < BASE32_ENCODE_INPUT ? dwSrcSize : BASE32_ENCODE_INPUT);
n1 = n2 = n3 = n4 = n5 = n6 = n7 = n8 = 0;
switch (dwBlockSize)
{
case 5:
n8 = (pSrc[4] & 0x1f);
n7 = ((unsigned char)(pSrc[4] & 0xe0) >> 5);
case 4:
n7 |= ((unsigned char)(pSrc[3] & 0x03) << 3);
n6 = ((unsigned char)(pSrc[3] & 0x7c) >> 2);
n5 = ((unsigned char)(pSrc[3] & 0x80) >> 7);
case 3:
n5 |= ((unsigned char)(pSrc[2] & 0x0f) << 1);
n4 = ((unsigned char)(pSrc[2] & 0xf0) >> 4);
case 2:
n4 |= ((unsigned char)(pSrc[1] & 0x01) << 4);
n3 = ((unsigned char)(pSrc[1] & 0x3e) >> 1);
n2 = ((unsigned char)(pSrc[1] & 0xc0) >> 6);
case 1:
n2 |= ((unsigned char)(pSrc[0] & 0x07) << 2);
n1 = ((unsigned char)(pSrc[0] & 0xf8) >> 3);
break;
default:
assert(0);
}
pSrc += dwBlockSize;
dwSrcSize -= dwBlockSize;
/* Validate */
assert(n1 <= 31);
assert(n2 <= 31);
assert(n3 <= 31);
assert(n4 <= 31);
assert(n5 <= 31);
assert(n6 <= 31);
assert(n7 <= 31);
assert(n8 <= 31);
/* Padding */
switch (dwBlockSize)
{
case 1: n3 = n4 = 32;
case 2: n5 = 32;
case 3: n6 = n7 = 32;
case 4: n8 = 32;
case 5:
break;
default:
assert(0);
}
/* 8 outputs */
*dest++ = BASE32_ENCODE_TABLE[n1];
*dest++ = BASE32_ENCODE_TABLE[n2];
*dest++ = BASE32_ENCODE_TABLE[n3];
*dest++ = BASE32_ENCODE_TABLE[n4];
*dest++ = BASE32_ENCODE_TABLE[n5];
*dest++ = BASE32_ENCODE_TABLE[n6];
*dest++ = BASE32_ENCODE_TABLE[n7];
*dest++ = BASE32_ENCODE_TABLE[n8];
dwDestSize += BASE32_ENCODE_OUTPUT;
}
*dest++ = '\x0'; /*append terminator*/
return dwDestSize;
}
else
return 0; /*ERROR - null pointer*/
}
/****************************** Base32 Decoding ******************************/
static const size_t BASE32_DECODE_INPUT = 8;
static const size_t BASE32_DECODE_OUTPUT = 5;
static const size_t BASE32_DECODE_MAX_PADDING = 6;
static const unsigned char BASE32_DECODE_MAX = 31;
static const unsigned char BASE32_DECODE_TABLE[0x80] = {
/*00-07*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
/*08-0f*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
/*10-17*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
/*18-1f*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
/*20-27*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
/*28-2f*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
/*30-37*/ 0xFF, 0xFF, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /*6 = '2'-'7'*/
/*38-3f*/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0xFF, 0xFF, /*1 = '='*/
/*40-47*/ 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, /*7 = 'A'-'G'*/
/*48-4f*/ 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, /*8 = 'H'-'O'*/
/*50-57*/ 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, /*8 = 'P'-'W'*/
/*58-5f*/ 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /*3 = 'X'-'Z'*/
/*60-67*/ 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, /*7 = 'a'-'g' (same as 'A'-'G')*/
/*68-6f*/ 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, /*8 = 'h'-'o' (same as 'H'-'O')*/
/*70-77*/ 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, /*8 = 'p'-'w' (same as 'P'-'W')*/
/*78-7f*/ 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF /*3 = 'x'-'z' (same as 'X'-'Z')*/
};
int cyoBase32Validate(const char* src, size_t size)
{
/*
* returns 0 if the source is a valid base32 encoding
*/
if (size % BASE32_DECODE_INPUT != 0)
return -1; /*ERROR - size isn't a multiple of 8*/
for (; size >= 1; --size, ++src)
{
unsigned char ch = *src;
if ((ch >= 0x80) || (BASE32_DECODE_TABLE[ch] > BASE32_DECODE_MAX))
break;
}
for (; 1 <= size && size <= BASE32_DECODE_MAX_PADDING; --size, ++src)
{
unsigned char ch = *src;
if ((ch >= 0x80) || (BASE32_DECODE_TABLE[ch] != BASE32_DECODE_MAX + 1))
break;
}
if (size != 0)
return -2; /*ERROR - invalid base32 character*/
return 0; /*OK*/
}
size_t base32DecodeGetLength(size_t size)
{
/*
* output 5 bytes for every 8 input:
* 1 2 3 4 5
* 1 = ---11111 = 11111---
* 2 = ---111XX = -----111 XX------
* 3 = ---11111 = --11111-
* 4 = ---1XXXX = -------1 XXXX----
* 5 = ---1111X = ----1111 X-------
* 6 = ---11111 = -11111--
* 7 = ---11XXX = ------11 XXX-----
* 8 = ---11111 = ---11111
*/
if (size % BASE32_DECODE_INPUT == 0)
return (((size + BASE32_DECODE_INPUT - 1) / BASE32_DECODE_INPUT) * BASE32_DECODE_OUTPUT) + 1; /*plus terminator*/
else
return 0; /*ERROR - size isn't a multiple of 8*/
}
size_t base32Decode(void* dest, const char* src, size_t size)
{
if (dest && src && (size % BASE32_DECODE_INPUT == 0))
{
unsigned char* pDest = (unsigned char*)dest;
size_t dwSrcSize = size;
size_t dwDestSize = 0;
unsigned char in1, in2, in3, in4, in5, in6, in7, in8;
while (dwSrcSize >= 1)
{
/* 8 inputs */
in1 = *src++;
in2 = *src++;
in3 = *src++;
in4 = *src++;
in5 = *src++;
in6 = *src++;
in7 = *src++;
in8 = *src++;
dwSrcSize -= BASE32_DECODE_INPUT;
/* Validate ascii */
if (in1 >= 0x80 || in2 >= 0x80 || in3 >= 0x80 || in4 >= 0x80
|| in5 >= 0x80 || in6 >= 0x80 || in7 >= 0x80 || in8 >= 0x80)
return 0; /*ERROR - invalid base32 character*/
/* Convert ascii to base16 */
in1 = BASE32_DECODE_TABLE[in1];
in2 = BASE32_DECODE_TABLE[in2];
in3 = BASE32_DECODE_TABLE[in3];
in4 = BASE32_DECODE_TABLE[in4];
in5 = BASE32_DECODE_TABLE[in5];
in6 = BASE32_DECODE_TABLE[in6];
in7 = BASE32_DECODE_TABLE[in7];
in8 = BASE32_DECODE_TABLE[in8];
/* Validate base32 */
if (in1 > BASE32_DECODE_MAX || in2 > BASE32_DECODE_MAX)
return 0; /*ERROR - invalid base32 character*/
/*the following can be padding*/
if ((int)in3 > (int)BASE32_DECODE_MAX + 1 || (int)in4 > (int)BASE32_DECODE_MAX + 1 || (int)in5 > (int)BASE32_DECODE_MAX + 1
|| (int)in6 > (int)BASE32_DECODE_MAX + 1 || (int)in7 > (int)BASE32_DECODE_MAX + 1 || (int)in8 > (int)BASE32_DECODE_MAX + 1)
return 0; /*ERROR - invalid base32 character*/
/* 5 outputs */
*pDest++ = ((unsigned char)(in1 & 0x1f) << 3) | ((unsigned char)(in2 & 0x1c) >> 2);
*pDest++ = ((unsigned char)(in2 & 0x03) << 6) | ((unsigned char)(in3 & 0x1f) << 1) | ((unsigned char)(in4 & 0x10) >> 4);
*pDest++ = ((unsigned char)(in4 & 0x0f) << 4) | ((unsigned char)(in5 & 0x1e) >> 1);
*pDest++ = ((
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论





























收起资源包目录



共 2 条
- 1
资源评论


910289813
- 粉丝: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 注册公用设备工程师考试专业课精讲精练疑难解答.doc
- 各类梁的弯矩剪力计算汇总表.docx
- 17级计算机试题及答案.doc
- 水库淹没处理及工程永久占地.doc
- 风电基础知识教程.ppt
- 关于网络攻防演练总结报告【六篇】.docx
- satwe-空间有限元分析与设计.docx
- 工程进度控制(监理).doc
- 企业员工培训效果评估机制体系建设.doc
- 2016年营改增后房地产相关税费计算.pptx
- 学院实训楼结构设计计算书.doc
- 新疆某信息中心综合楼造价分析.doc
- 高空作业、动火、有限空间审批单.docx
- 污水处理厂平面及高程布置(毕业设计).doc
- 加强带在污水处理水池中的应用.doc
- 工业管道钢结构焊接施工工艺培训.ppt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
