万捷博客

万捷博客
一个知识汇聚的地方
首页 » c++ » c++字符串二进制与十六进制转换BytyToHex支持中文

c++字符串二进制与十六进制转换BytyToHex支持中文

#include <iostream>

using namespace std;

// 把字节码转为十六进制码,一个字节两个十六进制,内部为字符串分配空间
char* ByteToHex(const unsigned char* vByte, const int vLen)
{
    if (!vByte)
        return NULL;

    char* tmp = new char[vLen * 2]; // 一个字节两个十六进制码,最后要多一个'/0'

    int tmp2;
    for (int i = 0; i < vLen; i++)
    {
        tmp2 = (int)(vByte[i]) / 16;
        tmp[i * 2] = (char)(tmp2 + ((tmp2 > 9) ? 'A' - 10 : '0'));
        tmp2 = (int)(vByte[i]) % 16;
        tmp[i * 2 + 1] = (char)(tmp2 + ((tmp2 > 9) ? 'A' - 10 : '0'));
    }
    
    tmp[vLen * 2 + 1] = { 0 };
    
    return tmp;
}

// 把十六进制字符串,转为字节码,每两个十六进制字符作为一个字节
unsigned char* HexToByte(const char* szHex)
{
    if (!szHex)
        return NULL;

    int iLen = strlen(szHex);

    if (iLen <= 0 || 0 != iLen % 2)
        return NULL;

    unsigned char* pbBuf = new unsigned char[iLen / 2];  // 数据缓冲区

    int tmp1, tmp2;
    for (int i = 0; i < iLen / 2; i++)
    {
        tmp1 = (int)szHex[i * 2] - (((int)szHex[i * 2] >= 'A') ? 'A' - 10 : '0');

        if (tmp1 >= 16)
            return NULL;

        tmp2 = (int)szHex[i * 2 + 1] - (((int)szHex[i * 2 + 1] >= 'A') ? 'A' - 10 : '0');

        if (tmp2 >= 16)
            return NULL;

        pbBuf[i] = (tmp1 * 16 + tmp2);
    }

    return pbBuf;
}

int main()
{
    const char* b = "啊啊!@#$%^&*()_+~`1234567890-=";
    char* Hexsb = new char[sizeof(b) * 2 + 1];
    Hexsb = (char*)ByteToHex((const unsigned char*)b,strlen(b));
    std::cout << Hexsb << endl;

    const char* a = (char*)"B0A1B0A121402324255E262A28295F2B7E60313233343536373839302D3D";
    char* Hexs  = new char[sizeof(a) / 2 + 1];
	Hexs  = (char*)HexToByte(a);
    std::cout << Hexs <<  endl;

    return 0;
}

文章如无特别注明均为原创! 作者: admin, 转载或复制请以 超链接形式 并注明出处 万捷博客
原文地址《 c++字符串二进制与十六进制转换BytyToHex支持中文》发布于2020-3-9

打赏作者

评论

游客

看不清楚?点图切换
切换注册

登录

您也可以使用第三方帐号快捷登录

切换登录

注册