JS

解决方法来源于知乎新码笔记的文章

function b64Encode(str) {
return btoa(unescape(encodeURIComponent(str)));
}
function b64Decode(str) {
return decodeURIComponent(escape(atob(str)));
}
let name = '新码笔记';
let encodedData = b64Encode(name);
// 输出:5paw56CB56yU6K6w
let decodedData = b64Decode('5paw56CB56yU6K6w')
// 解码输出:新码笔记

C++

C++ 实现包含中文字符用Base64编码传输 和 解码读取数据_NickAsuo_CSDN博客

base64.h:

#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include <assert.h>
#include <windows.h>
#include <iostream>
typedef unsigned char uint8;
typedef unsigned long uint32;
uint32 base64_encode(char* input, uint8* encode);
int base64_decode(const uint8* code, uint32 code_len, char* str);
char* G2U(const char* gb2312);

base64.cpp:

#include "base64.h"

static uint8 alphabet_map[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static uint8 reverse_map[] =
{
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 255, 255, 255,
255, 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, 255, 255, 255, 255, 255,
255, 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, 255, 255, 255, 255, 255
}; //GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
return str;
}
//UTF-8到GB2312的转换
char* U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
return str;
} uint32 base64_encode(char* input, uint8* encode)
{
//1、包含中文的字符串 字符编码(windows默认是gbk)转换成unicode //2、字符编码方式是utf-8的二进制
uint8* text = (uint8*)G2U(input);
uint32 text_len = (uint32)strlen((char*)text); uint32 i, j;
for (i = 0, j = 0; i + 3 <= text_len; i += 3)
{
encode[j++] = alphabet_map[text[i] >> 2]; //取出第一个字符的前6位并找出对应的结果字符
encode[j++] = alphabet_map[((text[i] << 4) & 0x30) | (text[i + 1] >> 4)]; //将第一个字符的后2位与第二个字符的前4位进行组合并找到对应的结果字符
encode[j++] = alphabet_map[((text[i + 1] << 2) & 0x3c) | (text[i + 2] >> 6)]; //将第二个字符的后4位与第三个字符的前2位组合并找出对应的结果字符
encode[j++] = alphabet_map[text[i + 2] & 0x3f]; //取出第三个字符的后6位并找出结果字符
} if (i < text_len)
{
uint32 tail = text_len - i;
if (tail == 1)
{
encode[j++] = alphabet_map[text[i] >> 2];
encode[j++] = alphabet_map[(text[i] << 4) & 0x30];
encode[j++] = '=';
encode[j++] = '=';
}
else //tail==2
{
encode[j++] = alphabet_map[text[i] >> 2];
encode[j++] = alphabet_map[((text[i] << 4) & 0x30) | (text[i + 1] >> 4)];
encode[j++] = alphabet_map[(text[i + 1] << 2) & 0x3c];
encode[j++] = '=';
}
}
encode[j] = 0;
return j;
} int base64_decode(const uint8* code, uint32 code_len, char* str)
{
uint8 plain[1024];
assert((code_len & 0x03) == 0); //如果它的条件返回错误,则终止程序执行。4的倍数。 uint32 i, j = 0;
uint8 quad[4];
for (i = 0; i < code_len; i += 4)
{
for (uint32 k = 0; k < 4; k++)
{
quad[k] = reverse_map[code[i + k]];//分组,每组四个分别依次转换为base64表内的十进制数
} assert(quad[0] < 64 && quad[1] < 64); plain[j++] = (quad[0] << 2) | (quad[1] >> 4); //取出第一个字符对应base64表的十进制数的前6位与第二个字符对应base64表的十进制数的前2位进行组合 if (quad[2] >= 64)
break;
else if (quad[3] >= 64)
{
plain[j++] = (quad[1] << 4) | (quad[2] >> 2); //取出第二个字符对应base64表的十进制数的后4位与第三个字符对应base64表的十进制数的前4位进行组合
break;
}
else
{
plain[j++] = (quad[1] << 4) | (quad[2] >> 2);
plain[j++] = (quad[2] << 6) | quad[3];//取出第三个字符对应base64表的十进制数的后2位与第4个字符进行组合
}
}
plain[j] = 0;
char str[1024] = "";
strcpy_s(str, 1024, (char*)plain);
strcpy_s(str, sizeof(plain), U2G(str));
return j;
}

测试程序:

#include <stdio.h>
#include <Windows.h> #include"base64.h"
#include<iostream>
using namespace std;
int main() {
char input[256] = "lsadfakdf;sdfkjsldf数量的飞机上的浪费", buffer2[1000];
uint8 buffer[1000];
int size = base64_encode(input, buffer);
printf("%s\n", buffer);
base64_decode(buffer, size, buffer2);
printf("%s\n", buffer2);
return 0;

【记录】BASE64|解决JS和C++中文传输乱码,内含两种语言的Base64编码解码的代码的更多相关文章

  1. 通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

     通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名 ...

  2. 解决Sublime Text 3中文显示乱码问题

    之前用Sublime Text 2,阅读了你是猴子派的救兵吗写的博客解决Sublime Text 2中文显示乱码问题,解决了问题. 后来嫌版本2启动太慢了,换成Sublime Text 3之后,发现网 ...

  3. 解决Sublime Text 3中文显示乱码问题(转)

    解决Sublime Text 3中文显示乱码问题(转) 1.打开Sublime Text 3,按Ctrl+-打开控制行,复制粘贴以下python代码,然后回车运行. 2. 复制并粘贴如下代码: 2.重 ...

  4. 如何解决 Matlab 画图时中文显示乱码的问题?

    使用的是win10系统,从前几个月某一天,我的matlab的figure里的中文都变成了口口.很是郁闷,还以为是动到了什么配置引起的. 前几天更新了matlab 2018b,发现还有这个问题.就觉得不 ...

  5. 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结

    史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...

  6. 【Qt开发】解决Qt5.7.0中文显示乱码的问题

    [Qt开发]解决Qt5.7.0中文显示乱码的问题 亲测可用: 乱码主要是编码格式的问题,这里可以通过Edit菜单中选择当前文档的编码方式,选择按照UTF-8格式保存,然后输入对应的中文,保存,然后运行 ...

  7. 完美解决ExtJs6上传中文文件名乱码,后端SpringMVC

    ExtJs上传中文文件名乱码,观察请求. ExtJs6上传乱码从后台无法解决,因为文件名请求里面就已经乱码了,后台无法解码. 除非请求参数正确没有乱码,后台因为编码设置不一样,可以通过后台处理乱码 这 ...

  8. WebGIS中解决使用Lucene进行兴趣点搜索排序的两种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 目前跟信息采集相关的一个项目提出了这样的一个需求:中国银行等 ...

  9. 解决Mysql的主从数据库没有同步的两种方法

    今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist;   查看下进程是否Sleep太多.发现很正常.show master status; ...

  10. 用js写出光棒效应的两种方法与jquery的两中方法

    <script src="js/jQuery1.11.1.js" type="text/javascript"></script> &l ...

随机推荐

  1. LangChain基础篇 (05)

    LangChain 核心模块:Data Conneciton - Document Transformers 一旦加载了文档,通常会希望对其进行转换以更好地适应您的应用程序. 最简单的例子是,您可能希 ...

  2. jenkins的admin用户的初始密码路径

    以下命令查看即可

  3. Deepseek学习随笔(6)--- API 开发与自动化

    获取 API Key 要开始使用 DeepSeek 的 API,你首先需要获取 API Key: 登录 DeepSeek 控制台 . 进入 API 管理 页面,生成 API Key. API 调用示例 ...

  4. Pm2安装以及守护傻妞机器人进程教程

    本教程以centos7为例子,其他系统可自行替换 一.安装 1.安装nodejs yum install nodejs 2.安装pm2 cd /root && npm install ...

  5. mybatis - [07] 模糊查询

    题记部分 (1)mapper类 List<User> getUserLike(String value); (2)mapper.xml <!-- 写法1 --> <sel ...

  6. Docker - 在线音乐播放器 YesPlayMusic

    原文链接:https://mp.weixin.qq.com/s/D2778fnix6jAeZlCicWGdw(本文只作为跟练,不以盈利为目的) 1.下载镜像 [root@node ~]# docker ...

  7. 【论文随笔】深度推荐系统的自动化_一项调查(Automl for deep recommender systems_ A survey)

    前言 今天读的论文为一篇于2021年1月发表在ACM Transactions on Information Systems的论文,本文是一篇关于深度推荐系统自动化机器学习(AutoML)的综述,由R ...

  8. Go语言中的匿名函数和闭包,简单理解

    匿名函数是一种没有函数名的函数,即定义即使用:闭包作为一种携带状态的函数,我们可以简单地将它理解为"对象",因为它同时具备状态和行为. 匿名函数 匿名函数没有函数名,只有函数体,它 ...

  9. ORACLE数据挖掘之 MSET-SPRT

    虽然是熟悉的Oracle数据库,但关于机器学习.数据挖掘这方面的知识笔者起初也是不了解的,文中MSET相关设置来源于同事提供的sample,在测试过程中边查资料边学习吸收,也因此看到了别样的Oracl ...

  10. Sql 字符串截取

    注意 不同数据库内置函数名称或有差异,可参考 1.从左至右截取 ①使用left()函数可以从左至右对字符串进行截取 语法:LEFT(str,length) str是要进行截取的字符串,length是要 ...