字符编码的本质

目的

最近做一个加密方面的研究,加密之后的二进制,通过转码之后,再也找不回之前的二进制了。
怎么试都不行,真是非常得奇怪!!!!
在这里插入图片描述
先说说字符编码基础知识
在信息技术的海洋中,字符编码是数据表示的基本桥梁,它使计算机能够存储和传输文本信息。字符编码的本质,是对字符集进行数字化的一种方式,通过特定的编码规则将文字转换为计算机可以处理的二进制代码。理解字符编码的工作原理对于从事软件开发、数据处理等IT行业的专业人员来说至关重要。
字符集与编码
字符集是一组符号和编码的集合,而编码则是这些字符集的数字化表示(这句话有理,编码就是二进制,转化编码就是更改二进制)。不同的编码方式有不同的特性,它们决定了数据存储、网络传输及文件处理的效率和范围。
常见字符编码
字符编码的种类繁多,常见的包括ASCII、GBK、UTF-8等。每种编码都有其特定的使用背景和适用场景。掌握这些基础知识,有助于我们更好地处理国际化文本、网络数据交换等问题。

情况分析

实例分析

在这里插入图片描述
点击加密之后显示:
在这里插入图片描述
点击解密之后:
在这里插入图片描述
解密里没显示什么,后台提示了报错:
在这里插入图片描述
怎么回事,那就跟踪代码看看情况:
先看加密的代码:
源码如下:

QByteArray AesUtil::encrypt(const QString& plaintext, const QString& key) {qDebug("enter function AesUtil::encrypt");qDebug()<< "plaintext="<< plaintext << "key.hex()=" << key.toLocal8Bit().toHex();try {QByteArray hashKey = QCryptographicHash::hash(key.toUtf8(),QCryptographicHash::Sha256);hashKey = hashKey.left(16);qDebug() << "hashKey.toHex()=" << hashKey.toHex();//std::string plain = qtToStdString(plaintext);std::string plain = plaintext.toUtf8();//std::string plain2 = plaintext.toUtf8().constData();//std::string keyStr = qtToStdString(key);byte iv[CryptoPP::AES::BLOCKSIZE] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption encryptor((byte*)hashKey.data(), hashKey.size(), iv);std::string cipher;CryptoPP::StringSource(plain, true,new CryptoPP::StreamTransformationFilter(encryptor,new CryptoPP::StringSink(cipher)));// 将二进制密文转换为十六进制字符串便于显示和传输/*string encoded;StringSource(cipher, true,new HexEncoder(new StringSink(encoded)));*/QByteArray ar1 = QByteArray::fromStdString(cipher);std::string cipher2 = ar1.toStdString();QString str1 = QString::fromLocal8Bit(cipher.c_str());QString str3 = QString::fromUtf8(cipher.c_str());QString str2 = ar1;QByteArray byteArray1 = QByteArray::fromStdString(cipher);qDebug() << "byteArray1.toHex()=" << byteArray1.toHex();QString qstr1 = QString::fromUtf8(byteArray1);qDebug() << "qstr1.toUtf8().toHex()= " << qstr1.toUtf8().toHex();qDebug() << "qstr1.toLocal8Bit().toHex()= " << qstr1.toLocal8Bit().toHex();QByteArray byteArray2 = qstr1.toUtf8();qDebug() << "byteArray2.toHex()=" << byteArray2.toHex();QByteArray byteArray3 = qstr1.toLatin1();qDebug() << "byteArray3.toHex()=" << byteArray3.toHex();qDebug("exit function AesUtil::encrypt");return QByteArray::fromStdString(cipher);}catch (const CryptoPP::Exception& e) {cerr << "加密失败: " << e.what() << endl;return "";}qDebug("exit function AesUtil::encrypt");
}

跟踪代码的情况:
在这里插入图片描述
调试情况:
在这里插入图片描述
下面把密文转化为QByteArray类型:
在这里插入图片描述
在这里插入图片描述

QByteArray的数据与原始二进制数据是一致的,因为负号的处理方式不同,所以有些显示不一样,但二进制数据是一样的。
在这里插入图片描述
在这里插入图片描述

到了QString数据明显不一样了,但表示的编码是一致的。
可以对比一下看看:(第一张图是原始加密二进制数据,第二张图是转化为QString的加密二进制数据)
在这里插入图片描述
上面最显著的区别是:原始数据[1][3][8][10]数值是不一样的,但到了QString 却成了一样的了是65533,并且都显示为?号。
这证明了QString进行了utf8的转化,这种编码转化是以字符为标准的进行更改相应的二进制数,也可以说是以显示的东西为标准,更改后面的二进制数,当然,也有相同的,相同是因为巧合而已,所以这说明了,要想保持二进制一样,就不能进行编码相关的转化。
因为编码的本质是以显示的东西一样为要求,对存储的二进制数进行更改。

解密时变化会更为明显:
在这里插入图片描述
在这里插入图片描述
解码的相关代码:
在这里插入图片描述
在这里插入图片描述

关于常用的编码

UTF-8 和 GBK 编码的本质区别在于‌字符集覆盖范围‌和‌编码方式‌:
字符集覆盖范围
‌GBK‌:基于 GB2312 扩展,支持21003个汉字及682个符号,主要用于中文信息处理。 ‌
‌UTF-8‌:基于 Unicode 标准,理论上支持任何字符(包括中文、英文、数字等),兼容 ASCII 字符,广泛应用于多语言场景。 ‌
编码方式
‌GBK‌:采用双字节编码,首字节为0x81-0xFE,尾字节为0x40-0xFE,通过高位字节扩展汉字数量。 ‌
‌UTF-8‌:可变长度编码(1-4字节),第一个字节与ASCII兼容,后续字节用于扩展字符范围。 ‌
应用场景
‌GBK‌:适合中文系统内部处理(如Windows系统默认中文编码)。 ‌
‌UTF-8‌:优先用于国际化和跨平台数据交换(如网页、邮件)。

总结

之所以出现了上面的错误,还是没理解字符编码的本质,编码就是用数字对应字符,就是这么简单。
比如ASCII编码:
在这里插入图片描述
最后总结:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95331.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网格图--Day03--网格图DFS--2658. 网格图中鱼的最大数目,1034. 边界着色,1020. 飞地的数量

网格图–Day03–网格图DFS–2658. 网格图中鱼的最大数目&#xff0c;1034. 边界着色&#xff0c;1020. 飞地的数量 今天要训练的题目类型是&#xff1a;【网格图DFS】&#xff0c;题单来自灵艾山茶府。 适用于需要计算连通块个数、大小的题目。 部分题目做法不止一种&#xff0…

新能源车焊接中发那科机器人保护气省气方法

在新能源汽车制造领域&#xff0c;焊接工艺是保障车身结构强度与安全性的关键环节&#xff0c;发那科焊接机器人凭借高精度与稳定性成为产线主力设备。保护气体消耗在焊接成本中占比显著&#xff0c;寻找高效省气方法成为行业降本增效的核心需求。WGFACS节气装置以智能化控制技…

CornerNet2025再研究---将目标检测问题视作关键点检测与配对

CornerNet于2019年3月份提出&#xff0c;CW近期回顾了下这个在当时引起不少关注的目标检测模型&#xff0c;它的亮点在于提出了一套新的方法论——将目标检测转化为对物体成对关键点(角点)的检测。通过将目标物体视作成对的关键点&#xff0c;其不需要在图像上铺设先验锚框(anc…

【C++】vector(2)

目录 1. insert的实现 2. 迭代器失效 2.1 迭代器失效的两种情况 指向已释放的内存&#xff08;物理失效&#xff09; 元素移动导致迭代器指向错误&#xff08;逻辑失效&#xff09; 2.2 修改代码 3. erase的实现 ​编辑修改代码 4. resize的实现 5. 构造函数 5.1 默认…

机器翻译:python库translatepy的详细使用(集成了多种翻译服务)

更多内容请见: 机器翻译修炼-专栏介绍和目录 文章目录 一、translatepy概述 1.1 translatepy介绍 1.1 安装 二、基本使用 2.1 初始化 `Translator` 2.2 文本翻译 2.3 语言检测 2.4 获取翻译备选方案 2.5 单词音标获取 2.6 语音合成 2.7 例句查询 2.8 拼写检查 三、高级功能 3.…

Spring Bean生命周期的完全指南

简介&#xff1a;超越Bean——揭开Spring Bean的隐秘生活 想象一场复杂宏大的舞台剧。作为观众&#xff0c;我们看到的是最终的演出——一个流畅运行的应用程序。但在这光鲜的幕后&#xff0c;隐藏着一套严谨细致的流程&#xff1a;选角&#xff08;实例化Bean&#xff09;、试…

网络安全A模块专项练习任务九解析

任务九&#xff1a;Linux操作系统安全配置-2任务环境说明&#xff1a; (Linux)系统&#xff1a;用户名root&#xff0c;密码1234561. 设置禁止使用最近用过的6个旧密码&#xff0c;将配置文件中对应的部分截图&#xff1b;编辑/etc/pam.d/system-auth文件&#xff0c;找到passw…

Linex进程管理

一、进程查看命令1.pstree用于查看进程树之间的关系&#xff0c;谁是父进程&#xff0c;谁是子进程&#xff0c;可以清楚的看出来是谁创建了谁语法&#xff1a;pstree [选项] -A各进程树之间的连接以ASCII码字符来连接-U各进程树之间的连接以utf8字符来连接&#xff0c;某些终…

手写MyBatis第47弹:Interceptor接口设计与Invocation上下文传递机制--MyBatis动态代理生成与方法拦截的精妙实现

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

自动驾驶中的传感器技术37——Lidar(12)

这里对当前Lidar中的一些常见问题进行专项论述。首先以禾赛Lidar为例&#xff0c;列出相关参数&#xff0c;以备论述。 图1 禾赛AT128参数图2 禾赛AT360参数图3 禾赛AT1440参数图4 禾赛AT128可靠性验证项图5 禾赛AT128产品证书1、Lidar的线束是什么&#xff0c;由什么决定&…

Meteor主题友链页面自研

发布于&#xff1a;Eucalyptus-Blog Meteor主题虽然设计简约现代&#xff0c;但由于缺乏原生的友情链接管理功能&#xff0c;许多博主只能将友情链接勉强添加在网站底部&#xff0c;这不仅影响页面美观&#xff0c;也不便于访客查找和互动&#xff1b;为了解决这一痛点&#xf…

QT控件QPlainTextEdit、QTextEdit与QTextBrowser的区别

一.主要功能对比二.关键功能差异1.文本类型支持QPlainTextEdit&#xff1a;仅支持纯文本&#xff08;Plain Text&#xff09;&#xff0c;不处理任何格式&#xff08;如字体、颜色、链接、图片等&#xff09;。文本以原始字符形式存储&#xff0c;适合处理日志、代码、配置文件…

【思考】WSL是什么

WSL WSL是什么呢&#xff1f; WSL 是 windows subsystem for linux 的简写&#xff0c;指的是 windows10 的一个子系统&#xff0c;这个子系统的作用是在 windows 下运行 linux 操作系统。 有了WSL&#xff0c;就可以在 windows10 中运行linux操作系统了。许多在 linux 种运行的…

基于单片机智能饮水机/智能热水壶

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 基于单片机的智能饮水机系统通过嵌入式技术实现水温控制、水量监测及用户交互功能。系统采用STM3…

Unity游戏打包——iOS打包基础、传包

本文由 NRatel 历史笔记整理而来&#xff0c;如有错误欢迎指正。 相关参考文档 Unity文档 -> 平台开发 -> IOS https://docs.unity3d.com/cn/2021.3/Manual/iphone.html Unity导出的Xcode 项目的结构 Modifying an Xcode project use Xcode.PBXProject. https://doc…

pyside6小项目:进制转换器

from PySide6.QtUiTools import QUiLoader from PySide6.QtWidgets import QApplication,QWidgetclass MyWindow(QWidget):def __init__(self):super().__init__()self.ui QUiLoader().load(trans.ui)self.ui.show()#stor data type dictionaryself.lengthVar {米:100, 千米:…

再见 K8s!3款开源的云原生部署工具

前文&#xff0c;和大家分享了云原生中的核心工具 K8s&#xff1a; 关于 K8s&#xff1a;入门&#xff0c;这篇就够了 K8s是个好东西&#xff0c;就是上手门槛有点高。这不&#xff0c;需求就来了&#xff1f; 有需求&#xff0c;就有工具。 为了解决K8s的配置难题&#xf…

C++ 快速复习指南(上半部分)

1.基础语法基本结构#include <iostream> 头名 using namesapce std ; 统一使用命名空间 int main () { 程序执行门户 主题内容}基本输出 cout << "string " << endl; // 输出 string 变量和数据类型 格式int intger 10 ;常量的引入 需要在变量…

ArcGIS Pro 地图打包与解包

如果需要在ArcGIS Pro 打包某一个地图文档&#xff0c;在 菜单栏中 点击 共享&#xff0c;点击地图。弹出 打包地图 面板&#xff0c;可以打包到Online、打包到地图包&#xff0c;选择将包保存到文件&#xff0c;修改项目详细信息&#xff0c;点击 包&#xff0c;即可实现打包。…

sunset: twilight靶场

sunset: twilight 来自 <sunset: twilight ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168.23.145 3&#xff0c;对靶机…