实现原理
1 byte = 8 bit
10进制 转 16进制
取 byte 前 4bit 与 后 4bit
在获取指定位置的元素
16进制 转 10进制
思路与上面相反
文件 base16.h
#pragma once
#include <string>
// 用于16进制转换
namespace base16
{
void ToString(const void* data, const int size, std::string& back_str);
void ToBase16(const std::string& base16_str, void* back_data, const int buf_size);
void ToBase16(const char* base16_str,const int str_len, void* back_data, const int buf_size);
}
文件 base16.cpp
#include "base16.h"
#include <string.h>
char buf_str[] = "0123456789ABCDEF";
char Base64StrToChar(const char str);
void base16::ToString(const void* data, const int size, std::string& back_str)
{
if (!data || size <= 0)
return;
back_str.resize(size * 2 + 1);
char* pos_ret = &back_str[0];
char* pos = (char*)data;
for (int i = 0; i < size; ++i)
{
(*(pos_ret++)) = buf_str[(pos[i] & 0XF0) >> 4];
(*(pos_ret++)) = buf_str[pos[i] & 0x0F];
}
}
void base16::ToBase16(const std::string& base16_str, void* back_data, const int buf_size)
{
ToBase16(base16_str.c_str(), base16_str.size(), back_data, buf_size);
}
void base16::ToBase16(const char* base16_str, const int str_len, void* back_data, const int buf_size)
{
int len = str_len / 2;
if (len > buf_size)
len = buf_size;
memset(back_data, 0, buf_size);
const char* pos_str = base16_str;
char* pos_back_data = (char*)back_data;
for (int i = 0; i < len; ++i)
pos_back_data[i] = (Base64StrToChar(*(pos_str++)) << 4) | Base64StrToChar(*(pos_str++));
}
char Base64StrToChar(const char str)
{
switch (str)
{
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 10;
case 'B': return 11;
case 'C': return 12;
case 'D': return 13;
case 'E': return 14;
case 'F': return 15;
}
return 0;
}
测试代码
#include <stdio.h>
#include "base16.h"
int main()
{
char cstr[] = "Hello World!";
std::string str;
base16::ToString(cstr, sizeof(cstr), str); // 10进制 转 16进制
printf("%s\n", str.c_str());
base16::ToBase16(str, cstr, sizeof(cstr)); // 16进制 转 10进制
printf("%s\n", cstr);
return 0;
}