字符編碼的本質

目的

最近做一個加密方面的研究,加密之后的二進制,通過轉碼之后,再也找不回之前的二進制了。
怎么試都不行,真是非常得奇怪!!!!
在這里插入圖片描述
先說說字符編碼基礎知識
在信息技術的海洋中,字符編碼是數據表示的基本橋梁,它使計算機能夠存儲和傳輸文本信息。字符編碼的本質,是對字符集進行數字化的一種方式,通過特定的編碼規則將文字轉換為計算機可以處理的二進制代碼。理解字符編碼的工作原理對于從事軟件開發、數據處理等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
英文地址,請注明出處:http://en.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;對靶機…