ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 常见进制转换代码

2022-05-12 14:00:28  阅读:216  来源: 互联网

标签:十六进制 进制 代码 C++ char 字符串 Parameter string


目录

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

标签:十六进制,进制,代码,C++,char,字符串,Parameter,string
来源: https://www.cnblogs.com/iBinary/p/16262184.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有