openssl編譯,C++安全方向openssl(二):2.2 C++代碼實現base16編解碼

 2023-10-05 阅读 19 评论 0

摘要:使用C++代碼編解碼,著重理解上一篇的概念,編碼的時候內存會擴大二倍,一個字節4位被轉為8位,字符變為兩個。 代碼如下 #include <iostream> #include <string>using namespace std;static const char BASE16_ENC_TAB[] =

使用C++代碼編解碼,著重理解上一篇的概念,編碼的時候內存會擴大二倍,一個字節4位被轉為8位,字符變為兩個。
代碼如下

#include <iostream>
#include <string>using namespace std;static const char BASE16_ENC_TAB[] = "0123456789ABCDEF";//0~9 對應的ASCII編碼是 58~57 'A' ~'F'對應的是65~70
static const char BASE16_DEC_TAB[] = {-1,                                                   //0-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,            //1~10-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,            //11~20-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,            //21~30-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,            //31~40-1,-1,-1,-1,-1,-1,-1, 0,  1, 2,            //41~503,  4, 5,  6, 7,  8, 9,-1,-1,-1,            //51~60-1,-1,-1,-1,10,11,12,13,14,15,          //61~70 'A'~'F'
};int Base16Encode(const unsigned char* in, int size, char* out)   //Base16轉碼的接口(編碼接口)
{//base16轉碼后空間會擴大一倍。4位轉成一個字符,所以一個字節就會轉成2個字符for (int i = 0; i < size; i++){//一個字節取出高4位和低四位  1000 0001 => 0000 1000(右移四位)char h = in[i] >> 4;    //取高4位,高位右移四位,低位去掉(0~15)char l = in[i] & 0x0F; //取低四位,與上0000 1111 (0~15)out[i * 2] = BASE16_ENC_TAB[h];  //(0~15)映射到對應字符out[i * 2 + 1] = BASE16_ENC_TAB[l]; // }return size * 2;  
}int Base16Decode(const string &in, unsigned char* out)
{//將兩個字符拼接成一個字節,一個作為高位,一個作為低位.B2E2CAD462617365313600for (int i = 0; i < in.size(); i += 2){unsigned char ch = in[i];              //高位轉換的字符 'B' => 66:10unsigned char cl = in[i + 1];         //低位轉換的字符 '2' => 50:2unsigned char h = BASE16_DEC_TAB[ch];  //轉換成原來的值unsigned char l = BASE16_DEC_TAB[cl];//兩個4位拼成一個字節(8位)// 1000 << 4  1000 0000(1)// 0001 不變    0000 0001(2)//(1)與(2)進行了或操作之后變成了1000 0001out[i / 2] = h << 4 | l;}return in.size() / 2; 
}int main(int argc, char* argv[])
{cout << "Test Base16" << endl;const unsigned char data[] = "測試base16";  //為什么要有中文,要判斷經過二進制轉碼之后,會不會出現問題int len = sizeof(data);char out1[1024] = { 0 };unsigned char out2[1024] = { 0 };cout << data << endl;int re = Base16Encode(data, len, out1);cout << re << ":" << out1 << endl;re = Base16Decode(out1, out2);cout << re << ":" << out2 << endl;return 0;
}

分析:上面的表格是自建的字符對應關系,這樣就不用使用遍歷解碼,解決了資源占用過多的問題。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/114382.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息