使用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;
}
分析:上面的表格是自建的字符對應關系,這樣就不用使用遍歷解碼,解決了資源占用過多的問題。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态