再平常写代码的时候经常会用到进制转换。 比如16进制转为10进制。
16进制值转为Ascii等。所以这里启用一个整理。方便下次炒代码。
代码来源于网上以及朋友提供的。
//************************************ // 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]); } }
//************************************ // 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; }
这种方式是从逆向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; }
上述方法命令结果为如下
IN -> "AABB" OUT-> "41414242"
//************************************ // Parameter: 带转换的的Ascii编码 // Parameter: 长度 // Parameter: 传出结果,是一个16进制字符串。 //************************************ void asc2hex( IN unsigned char *asc, IN int hexlength, OUT unsigned char *hex) { if (strlen((char*)asc) < hexlength * 2) { char *asc_temp = new char[hexlength * 2 + 1]; memset(asc_temp, 'F', hexlength * 2 + 1); memcpy(asc_temp, asc, strlen((char*)asc)); for (int i = 0; i < hexlength; i++) { char temp[3] = { asc_temp[i * 2], asc_temp[i * 2 + 1] }; hex[i] = strtol(temp, 0, 16); } delete[]asc_temp; } else { for (int i = 0; i < hexlength; i++) { char temp[3] = { asc[i * 2], asc[i * 2 + 1] }; hex[i] = strtol(temp, 0, 16); } } }
int Hex2Int(char c) { return (c >= '0' && c <= '9') ? (c)-'0' : (c >= 'A' && c <= 'F') ? (c)-'A' + 10 : (c >= 'a' && c <= 'f') ? (c)-'a' + 10 : 0; }
IN -> 'F' OUT -> 15
//************************************ // Parameter: 要转换的16进制字符串 // Parameter: 要转换的16进制字符串大小 // Parameter: 转换后的传出数据 // 传入16进制字符串 "AABB" 则 传出数据的Buff里面的字节则是 buf[0] = 'AA' buf[1] = '\xBB' 字节 //************************************ void Hex2Bin(const unsigned char* hex, int sz, unsigned char* out) { int i; for (i = 0; i < sz; i += 2) { out[i / 2] = (Hex2Int(hex[i]) << 4) | Hex2Int(hex[i + 1]); } }
//************************************ // Parameter: 代转换的Buff 设Buf[0] = 0xAA buf[1] = 0xBB // Parameter: buf大小 // Parameter: 传出结果,是一个16进制字符串。 //传出的是"AABB" //************************************ void Bin2Hex(const unsigned char* in, int sz, char* out) { int i; for (i = 0; i < sz; i++) { sprintf_s(out + (i * 2), 4, "%02x", in[i]); } }
//************************************ // Parameter: 要转换的10进制数 // Parameter: 转换后的结果是否添加前缀 0x // Parameter: 转换后的结果是否是大写 // 默认值返回大写不带前缀的十六进制字符串 //************************************ string dec2hex1( IN unsigned long long i, IN bool isAddPrefix = false, IN bool isUpcase = true) { stringstream ss; if (isAddPrefix) { if (isUpcase) { ss << showbase << hex << uppercase << i; //prepends 0x } else { ss << showbase << hex << nouppercase << i; //prepends 0x } } else { if (isUpcase) { ss << hex << uppercase << i; } else { ss << hex << nouppercase << i; } } return ss.str(); }
//************************************ // Parameter: 要转换的10进制数 // Parameter: 转换后的结果是否添加前缀 0x // Parameter: 转换后的结果是否是大写 // 默认值返回大写不带前缀的十六进制字符串 //************************************ string dec2hex2( IN unsigned long long i, IN bool isAddPrefix = false, IN bool isUpcase = true) { stringstream ss; string s; if (isAddPrefix) { if (isUpcase) { ss << showbase << hex << uppercase << i; //prepends 0x } else { ss << showbase << hex << nouppercase << i; //prepends 0x } } else { if (isUpcase) { ss << hex << uppercase << i; } else { ss << hex << nouppercase << i; } } ss >> s; return s; }
//************************************ // Parameter: 要转换的10进制数 // Parameter: 转换后的结果是否添加前缀 0x // Parameter: 转换后的结果是否是大写 // 默认值返回大写不带前缀的十六进制字符串 //************************************ string CFileOpt::dec2hex_c( IN unsigned long long i, IN bool isAddPrefix, IN bool isUpcase) { if (isAddPrefix) { if (isUpcase) { char s[20]; sprintf(s, "0X%X", i); return string(s); } else { char s[20]; sprintf(s, "0x%x", i); return string(s); } } else { if (isUpcase) { char s[20]; sprintf(s, "%X", i); return string(s); } else { char s[20]; sprintf(s, "%x", i); return string(s); } } return ""; }