C++ 进制转换代码记录
一丶进制转换
1.1 介绍
再平常写代码的时候经常会用到进制转换。 比如16进制转为10进制。
16进制值转为Ascii等。所以这里启用一个整理。方便下次炒代码。
代码来源于网上以及朋友提供的。
二丶 十六进制字符串转换为Ascii
2.1 方法1 Char类型操作
//************************************
// Parameter: 要进行转换的十六进制字符串
// Parameter: 十六进程字符串的长度
// Parameter: 传出的缓冲区,结果存放在此缓冲区,请注意一定保证缓冲区大小
//************************************
void CFileOpt::Hex2Asc1(IN unsigned char *hex, IN int hexlength, OUT unsigned char *asc)
{
for (int i = 0; i < hexlength; i++)
{
sprintf((char*)asc + 2 * i, "%02X", hex[i]);
}
}
2.2 方法2 STL String操作
//************************************
// Parameter: 要进行转换的十六进制字符串 string类型
// Return: 返回转换后的结构字符串
//************************************
std::string HexToAsc(string hexStr)
{
string res = "";
unsigned char* hexDigitTable = (unsigned char*)"0123456789abcdef";
for (int i = 0; i < hexStr.length(); i++)
{
unsigned char asciiDigit1 = hexDigitTable[hexStr.at(i) & 0x0f];
unsigned char asciiDigit0 = hexDigitTable[(hexStr.at(i) & 0xf0) >> 4];
res += asciiDigit0;
res += asciiDigit1;
}
return res;
}
2.3 方法3 google写法
这种方式是从逆向google Chrome的时候得到的。自己封装的
当然你可以自己修改参数
//************************************
// Parameter: 要进行转换的十六进制字符串
// Parameter: 十六进制字符串的长度
// Parameter: 传出的string 是一个指针 外面可以传递 &strxxx 也可以修改为引用
//************************************
bool Hex2Asc2(
const unsigned char* data,
int data_len,
std::string* string) {
if (!string)
return false;
string->clear();
if (data_len < 1 || !data)
return false;
static const char kHex[] = "0123456789ABCDEF";
// Fix the buffer size to begin with to avoid repeated re-allocation.
string->resize(data_len * 2);
int index = data_len;
while (index--) {
string->at(2 * index) = kHex[data[index] >> 4]; // high digit
string->at(2 * index + 1) = kHex[data[index] & 0x0F]; // low digit
}
return true;
}
2.4 总结
上述方法命令结果为如下
IN -> "AABB"
OUT-> "41414242"