C++ 常見進位制轉換程式碼
阿新 • • 發佈:2022-05-12
目錄
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"
三丶Ascii字串轉為16進位制字串
3.1 方法1 字元指標型別轉換
//************************************
// 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);
}
}
}
四丶十六進位制字元轉為整數
4.1 方法1 字元轉為整數
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
五丶十六進位制字串轉為二進位制
5.1 十六進位制字串轉為二進位制型別
//************************************
// 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]);
}
}
5.2 二進位制型別十六進位制轉為十六進位制字串
//************************************
// 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]);
}
}
六丶10進位制數字轉為16進位制字串
6.1方法1 STL版
//************************************
// 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;
}
6.2 方法2 C庫函式版
//************************************
// 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 "";
}