//BASE的编码、解码
// basecode.cpp - written and placed in thepublic domain by Wei Dai
#include "pch.h"
#ifndef CRYPTOPP_IMPORTS
#include "basecode.h"
#include "fltrimpl.h"
#include
NAMESPACE_BEGIN(CryptoPP)
//编码类的独立初始化,传入参数集
void BaseN_Encoder::IsolatedInitialize(constNameValuePairs ¶meters)
{
//参数集对象的初始化
//classCRYPTOPP_NO_VTABLE NameValuePairs
parameters.GetRequiredParameter("BaseN_Encoder",Name::EncodingLookupArray(), m_alphabet);
parameters.GetRequiredIntParameter("BaseN_Encoder",Name::Log2Base(), m_bitsPerChar);
//m_bitsPerChar为一次参与BASE编码的2进制位数,必须在1-7之间
if (m_bitsPerChar <= 0 || m_bitsPerChar >=8)
throwInvalidArgument("BaseN_Encoder: Log2Base must be between 1 and 7inclusive");
//填充符
byte padding;
bool pad;
if (parameters.GetValue(Name::PaddingByte(),padding))
pad =parameters.GetValueWithDefault(Name::Pad(), true);
else
pad = false;
m_padding = pad ? padding : -1;
m_bytePos = m_bitPos =0;
//计算输出缓冲区大小(BYTE为单位),并申请缓冲区
//因为以8位为单位,所以凑成能被BASE基数的位数m_bitsPerChar整除的最小数
int i = 8;
while (i%m_bitsPerChar != 0)
i += 8;
//计算缓冲区大小,以字节为单位
m_outputBlockSize = i/m_bitsPerChar;
//申请缓冲区
m_outBuf.New(m_outputBlockSize);
}
//BASEN的编码函数(如BASE64、BASE32等等)
size_t BaseN_Encoder::Put2(const byte *begin,size_t length, int messageEnd, bool blocking)
{
FILTER_BEGIN;
while (m_inputPosition < length)
//while (m_inputPosition< length)开始
{
if (m_bytePos ==0)
//初始化输出缓冲区全部置0,以开始新一轮
memset(m_outBuf,0, m_outputBlockSize );
{
//m_inputPosition移一个字节,取编码源流begin中的当前需要处理位置的字节b
//开始新一轮处理,以将该字节处理后所余下位数不够处理或正好处理完毕为一轮
//注意unsignedint在32位系统中,有32位大小,但m_inputPosition
//以一个字节为单位移动
unsignedint b = begin[m_inputPosition++], bitsLeftInSource = 8;
//bitsLeftInSource为源本次需要处理的位数,初值为8
//在b中以BASE基数的位数为单位扩展后填充8位缓冲区=====begin
//处理源和目标,将源以BASE基数要求的位数为单位拆开后,放入输出缓冲区
//的每个字节内,如BASE64则把源二进制流以6位为单位,放入每个字节中,
//一个字节还有2位暂时没用到,从源二进制流中每次取8位进行处理,这
//是必要的,因为要以字节为单位访问内存
while(true)
// while(true)循环开始
{
//确保m_bitPos在BASE基数位数之内
assert(m_bitPos < m_bitsPerChar);
//m_bitPos为上次应处理但未处理只能移交本次处理的位数,因为上次位数
//太少无法处理,如:BASE64,第一次顺利处理6位;第二次要处理2位,因为
//每次必须处理6位,所以第二次将b中2位移至最左边;然后,将b右移8-6=2
//位保存在m_outBuf[m_bytePos]中,然后进行判断发现无法完成处理,只能