c++ 高效 十六进制、十进制 互转

实现原理

1 byte = 8 bit

10进制 转 16进制

取 byte 前 4bit 与 后 4bit 

在获取指定位置的元素

16进制 转 10进制

思路与上面相反

 

文件 base16.h

#pragma once
#include 

// 用于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 

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 
#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;
}

 

你可能感兴趣的:(c++)