问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

谁能给我写个简单的汉字Base64解码代码并且告诉我原理。

发布网友 发布时间:2022-05-02 09:10

我来回答

3个回答

热心网友 时间:2022-04-18 08:53

这是编解码的代码,确认有效。
static size_t _base64Decode(unsigned char* pszNormal, const unsigned char* pczBase64, int nSize)
{
ASSERT(nSize > ZERO);

unsigned char* pszBase64Copy = NULL;
if( pczBase64 == pszNormal )
{
pszBase64Copy = new unsigned char[nSize]; ASSERT(pszBase64Copy);
::memcpy(pszBase64Copy, pczBase64, nSize);
}

size_t nsize = 0;
unsigned char* pucOrig = (NULL == pszBase64Copy) ? (unsigned char*)pczBase64 : pszBase64Copy;
unsigned char* pucDest = pszNormal;
for(int nNow = 0; nNow < nSize - 4; nNow += 4)
{
unsigned long ul = *(unsigned long*)pucOrig;
register int b0 = (_getBase64Index((char)B0(ul))<<2|_getBase64Index((char)B1(ul))<<2>>6)&MAX_BYTE;
register int b1 = (_getBase64Index((char)B1(ul))<<4|_getBase64Index((char)B2(ul))<<2>>4)&MAX_BYTE;
register int b2 = (_getBase64Index((char)B2(ul))<<6|_getBase64Index((char)B3(ul))<<2>>2)&MAX_BYTE;

*((unsigned long*)pucDest) = b0|b1<<8|b2<<16;
pucOrig += 4;
pucDest += 3;
nsize += 3;
}

if( nNow < nSize )
{
int nRest = nSize - nNow;
unsigned long ul = 0;
for(int j = 0; j < nRest; ++j){
*(((unsigned char*)&ul)+j) = *pucOrig++;
}

register int b0 = (_getBase64Index((char)B0(ul))<<2|_getBase64Index((char)B1(ul))<<2>>6)&MAX_BYTE;
*pucDest++ = b0;
nsize++;

if( (_EQ_ != B1(ul)) && (_EQ_ != B2(ul)) )
{
register int b1 = (_getBase64Index((char)B1(ul))<<4|_getBase64Index((char)B2(ul))<<2>>4)&MAX_BYTE;
*pucDest++ = b1;
nsize++;
}

if( (_EQ_ != B2(ul)) && (_EQ_ != B3(ul)) )
{
register int b2 = (_getBase64Index((char)B2(ul))<<6|_getBase64Index((char)B3(ul))<<2>>2)&MAX_BYTE;
*pucDest++ = b2;
nsize++;
}

}

*pucDest = _EOS_;

if( pszBase64Copy )
{
delete[] pszBase64Copy;
pszBase64Copy = NULL;
}

return nsize;
}

static int _base64Encode(unsigned char* pszBase64, const unsigned char* pczNormal, int nSize)
{
ASSERT(nSize > ZERO);

unsigned char* pszNormalCopy = NULL;
if( pczNormal == pszBase64 )
{
pszNormalCopy = new unsigned char[nSize];
::memcpy(pszNormalCopy, pczNormal, nSize);
}

size_t nsize = 0;
unsigned char* pucOrig = (NULL == pszNormalCopy) ? (unsigned char*)pczNormal : pszNormalCopy;
unsigned char* puc64 = pszBase64;
for(int nNow = 0; nNow < nSize - 3; nNow += 3)
{
unsigned long ul = *(unsigned long*)pucOrig;
register int b0 = _getBase64Char((B0(ul) >> 2) & 0x3F);
register int b1 = _getBase64Char((B0(ul) << 6 >> 2 | B1(ul) >> 4) & 0x3F);
register int b2 = _getBase64Char((B1(ul) << 4 >> 2 | B2(ul) >> 6) & 0x3F);
register int b3 = _getBase64Char((B2(ul) << 2 >> 2) & 0x3F);
*((unsigned long*)puc64) = b0 | b1 << 8 | b2 << 16 | b3 << 24;
nsize += 4;
puc64 += 4;
pucOrig += 3;
}

if( nNow < nSize )
{
int nRest = nSize - nNow;
unsigned long ul = 0;
for(int j = 0; j < nRest; ++j){
*(((unsigned char*)&ul) + j) = *pucOrig++;
}

puc64[0] = _getBase64Char((B0(ul) >> 2) & 0x3F);
puc64[1] = _getBase64Char((B0(ul) << 6 >> 2 | B1(ul) >> 4) & 0x3F);
puc64[2] = (nRest > 1)?_getBase64Char((B1(ul) << 4 >> 2 | B2(ul) >> 6) & 0x3F) : _EQ_;
puc64[3] = (nRest > 2)?_getBase64Char((B2(ul) << 2 >> 2) & 0x3F) : _EQ_;
puc64 += 4;
nsize += 4;
}

*puc64 = _EOS_;

if( pszNormalCopy )
{
delete[] pszNormalCopy;
pszNormalCopy = NULL;
}

return nsize;
}
在网络传输的时候,需要使用多字节编码,才能得到有效的汉字。
也就是说,当你传输一个汉字的时候,应该先把它用多字节编码,然后在接收端再把它还原为之前的编码。
另外,能否编辑中文,与操作系统的字符集有关,如果是中文操作系统的话,默认的是中文字符集,这是可以修改的,如果你修改成其他西文字符集的话,对汉字的编辑可能就会出现乱码。

热心网友 时间:2022-04-18 10:11

首先你需要把汉字按Unicode编码输入(也就是wchar_t *的字符串而不是char *的),然后再转成utf-8编码。然后再转成base64...

鉴于你能写出base64编码,utf-8的规则只要上网搜一下就可以了

热心网友 时间:2022-04-18 11:46

不太明白,但是希望你能够早日得到解决。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 收到商品记什么凭证 库存商品 凭证 进口商品的原始凭证是什么? 世界杯在俄罗斯的中国人有多少 宁夏商品一账通凭证是什么意思 俄罗斯有多少华人 在购买商品后,一定要索要什么因为它是我们售后更换商品的凭证? 到底有多少中国人飘在俄罗斯? 销售货物的发票属于什么凭证? 淘宝中,申请加入全球购时需填写的表格中“商品采购凭证”和“国际物流凭证”是指什么呢?求解~~高手 仓库接收商品的主要凭证是什么 什么是商品所有权凭证 什么事商品所有权凭证? sql 语句关于access 河南农村60岁养老金手机怎样认证上传? 河南养老保险怎么申请 河南社保养老认证注册不会上手机验证码是怎么回事? 河南城乡养老保险认证 小狗毛上有油漆可以用汽油洗吗 狗狗脚上踩到油漆了怎麼办 如何把字符串当作16进制进行base64编码? 有人知道十六进制转到base64编码的算法吗 请高手帮助解密MD5+base64的密码 基金从业资格会过期吗? 为什么冰箱叫冰箱不叫冰柜 基金从业资格考试几个小时 为什么电视机叫电视,电冰箱叫冰箱,电灯泡叫灯泡,电风扇叫风扇,电烫斗叫烫斗? 电脑开机密码符号怎么输入 电脑开机密码的人民币符号怎么打 我的台式电脑机开机密码里面有%和@和!这3种符号,求助高手这些符号怎么输入啊? ★●■这几个符号在电脑上怎么输入 咖啡豆和速溶咖啡是一样的吗? 咖啡粉,咖啡豆和速溶咖啡在营养上有什么区别? 交易所与做市商市场的区别是什么?其中投资银行的角色有何区别? 辛辣食物辛是指什么 辛辣食物的辛指的是什么食物 速溶咖啡与用咖啡豆有什么区别吗? 资产管理与投资银行的区别 辛辣中的辛是指什么 辛辣食物的“辛”是什么?