244 lines
5.2 KiB
C++
244 lines
5.2 KiB
C++
|
||
#include <string.h>
|
||
#include "EDCode.h"
|
||
#define BUFFERSIZE 20480
|
||
char EncBuf[BUFFERSIZE], TempBuf[BUFFERSIZE];
|
||
//
|
||
//void Encode6BitBuf(const char *src, char *dest, int srclen, int destlen)
|
||
//{
|
||
// int restcount, destpos;
|
||
// unsigned char made, ch, rest;
|
||
// restcount = 0;
|
||
// rest = 0;
|
||
// destpos = 0;
|
||
// for (int I=0; I<srclen;++I)
|
||
// {
|
||
// if (destpos >= destlen)
|
||
// break;
|
||
// ch = (unsigned char)src[I];
|
||
// made = (unsigned char)((rest | (ch >> (2+restcount))) & 0x3F);
|
||
// rest = (unsigned char)(((ch << (8 - (2+restcount))) >> 2) & 0x3F);
|
||
// restcount += 2;
|
||
// if (restcount < 6)
|
||
// {
|
||
// dest[destpos] = made + 0x3C;
|
||
// destpos++;
|
||
// }
|
||
// else
|
||
// {
|
||
// if (destpos < destlen-1)
|
||
// {
|
||
// dest[destpos] = made + 0x3C;
|
||
// dest[destpos+1] = rest + 0x3C;
|
||
// destpos += 2;
|
||
// }
|
||
// else
|
||
// {
|
||
// dest[destpos] = made + 0x3C;
|
||
// destpos++;
|
||
// }
|
||
// restcount = 0;
|
||
// rest = 0;
|
||
// }
|
||
// }
|
||
// if (restcount)
|
||
// {
|
||
// dest[destpos] = rest + 0x3C;
|
||
// destpos++;
|
||
// }
|
||
// dest[destpos] = 0;
|
||
//}
|
||
//
|
||
//void Decode6BitBuf(const char *source, char *buf, int buflen)
|
||
//{
|
||
// const
|
||
// unsigned char Masks[5] = {0xFC, 0xF8, 0xF0, 0xE0, 0xC0};
|
||
// int len, bitpos, madebit, bufpos;
|
||
// int ch, tmp, _unsigned char;
|
||
// len = (int)strlen(source);
|
||
// bitpos = 2;
|
||
// madebit = bufpos = tmp = ch = 0;
|
||
// for (int I=0;I<len;++I)
|
||
// {
|
||
// if ((source[I] - 0x3C) >= 0)
|
||
// ch = (unsigned char)(source[I] - 0x3C);
|
||
// else
|
||
// {
|
||
// bufpos = 0;
|
||
// break;
|
||
// }
|
||
// if (bufpos >= buflen)
|
||
// break;
|
||
// if ((madebit+6) >= 8)
|
||
// {
|
||
// _unsigned char = (unsigned char)(tmp | ((ch & 0x3F) >> (6-bitpos)));
|
||
// buf[bufpos] = _unsigned char;
|
||
// bufpos++;
|
||
// madebit = 0;
|
||
// if (bitpos < 6)
|
||
// bitpos += 2;
|
||
// else
|
||
// {
|
||
// bitpos = 2;
|
||
// continue;
|
||
// }
|
||
// }
|
||
// tmp = (unsigned char)((unsigned char)(ch << bitpos) & Masks[bitpos-2]); // #### ##--
|
||
// madebit += 8-bitpos;
|
||
// }
|
||
// buf[bufpos] = 0;
|
||
//}
|
||
|
||
const char EncryptMinChar = 0x3C; //编码后的最小值
|
||
//3编4方式的,如果值需要保持在0..7F范围内,则此值的范围是3C..40
|
||
|
||
|
||
|
||
unsigned int Encode6BitBuf(const char *pSrc, char *pDest, unsigned int dwSrcSize, unsigned int dwMaxSize)
|
||
{
|
||
//前端掩码
|
||
static const unsigned char btFrontMasks[4] = { 0xFF, 0xF8, 0xE0, 0x80 };
|
||
static const unsigned char btBehindMasks[4] = { 0x00, 0x01, 0x07, 0x1F };
|
||
static const unsigned char btBitMasks[4] = { 0x00, 0x06, 0x18, 0x60 };
|
||
|
||
char btSrc, btNew, btIdx, btFront, btBehind;
|
||
unsigned int dwSizeLeft;
|
||
|
||
dwSizeLeft = dwMaxSize;
|
||
|
||
if ( dwSizeLeft )
|
||
{
|
||
btIdx = 3;
|
||
btNew = 0;
|
||
|
||
while (dwSrcSize)
|
||
{
|
||
btSrc = *pSrc;
|
||
btNew = btNew | (btSrc & btBitMasks[btIdx]); //取第 btIdx 位
|
||
btFront = (btSrc & btFrontMasks[btIdx]) >> 2; //保存 btIdx 前的位
|
||
btBehind= btSrc & btBehindMasks[btIdx]; //保存 btIdx 后的位
|
||
|
||
*pDest = (btFront | btBehind ) + EncryptMinChar;
|
||
dwSizeLeft--;
|
||
if (!dwSizeLeft)
|
||
break;
|
||
pDest++;
|
||
btIdx--;
|
||
|
||
if ( !btIdx )
|
||
{
|
||
*pDest = (btNew >> 1) + EncryptMinChar;
|
||
dwSizeLeft--;
|
||
if (!dwSizeLeft)
|
||
break;
|
||
pDest++;
|
||
btIdx = 3;
|
||
btNew = 0;
|
||
}
|
||
|
||
pSrc++;
|
||
dwSrcSize--;
|
||
}
|
||
|
||
if ( !dwSrcSize && (btIdx != 3) )//remaind
|
||
{
|
||
*pDest = (btNew >> 1) + EncryptMinChar;;
|
||
dwSizeLeft--;
|
||
pDest++;
|
||
}
|
||
|
||
if ( dwSizeLeft )
|
||
pDest[0] = 0;
|
||
}
|
||
|
||
|
||
return dwMaxSize - dwSizeLeft;
|
||
}
|
||
|
||
unsigned int Decode6BitBuf(const char *pSrc, char *pDest, unsigned int dwSrcSize, unsigned int dwMaxSize)
|
||
{
|
||
//前端掩码
|
||
static const unsigned char btFrontMasks[4] = { 0xFF, 0xFE, 0xF8, 0xE0 };
|
||
static const unsigned char btBehindMasks[4]= { 0x00, 0x01, 0x07, 0x1F };
|
||
static const unsigned char btBitMasks[4] = { 0x00, 0x06, 0x18, 0x60 };
|
||
|
||
char btSrc, btFront, btBehind, btBits, btIdx;
|
||
unsigned int dwSizeLeft;
|
||
|
||
dwSizeLeft = dwMaxSize;
|
||
|
||
if ( dwSizeLeft )
|
||
{
|
||
btIdx = 3;
|
||
|
||
while ( dwSrcSize > 1 )
|
||
{
|
||
if ( btIdx == 3 )
|
||
{
|
||
btBits = (dwSrcSize > 3) ? pSrc[3] : pSrc[dwSrcSize-1];
|
||
btBits = (btBits - EncryptMinChar) << 1;
|
||
}
|
||
|
||
btSrc = *pSrc - EncryptMinChar;
|
||
btFront = (btSrc & btFrontMasks[btIdx]) << 2;
|
||
btBehind= btSrc & btBehindMasks[btIdx];
|
||
*pDest = btFront | btBehind | (btBits & btBitMasks[btIdx]);
|
||
|
||
dwSizeLeft--;
|
||
if ( !dwSizeLeft )
|
||
break;
|
||
pDest++;
|
||
btIdx--;
|
||
|
||
if ( !btIdx )
|
||
{
|
||
dwSrcSize--;
|
||
if ( !dwSrcSize )
|
||
break;
|
||
pSrc++;
|
||
btIdx = 3;
|
||
}
|
||
|
||
dwSrcSize--;
|
||
pSrc++;
|
||
}
|
||
|
||
if ( dwSizeLeft )
|
||
pDest[0] = 0;
|
||
}
|
||
|
||
return dwMaxSize - dwSizeLeft;
|
||
}
|
||
|
||
char * EnCodeBuffer(const void *InBuf, size_t BufSize)
|
||
{
|
||
if ( BufSize >= BUFFERSIZE )
|
||
BufSize = BUFFERSIZE - 1;
|
||
Encode6BitBuf((char*)InBuf, (char*)&EncBuf, (unsigned int)BufSize, BUFFERSIZE);
|
||
return EncBuf;
|
||
}
|
||
|
||
|
||
void DeCodeBuffer(const void *InBuf, void *OutBuf, size_t SrcSize, size_t MaxSize)
|
||
{
|
||
Decode6BitBuf ((char*)InBuf, (char*)EncBuf, (unsigned int)SrcSize, BUFFERSIZE);
|
||
memcpy(OutBuf, &EncBuf[0], MaxSize);
|
||
}
|
||
|
||
unsigned int GetEncryptedSize(unsigned int dwSize)
|
||
{
|
||
unsigned int Result = dwSize + dwSize / 3;
|
||
if ( dwSize % 3 )
|
||
Result++;
|
||
return Result;
|
||
}
|
||
|
||
unsigned int GetDecryptedSize(unsigned int dwSize)
|
||
{
|
||
unsigned int Result = dwSize / 4 * 3;
|
||
if ( dwSize & 3 )
|
||
Result += (dwSize & 3) - 1;
|
||
return Result;
|
||
}
|
||
|