string转byte


前言:某个JSON库的问题,其中json中取出的十六进制数据的一个问题

我遇到的问题就是类似如下的格式,json的probestring字段取出来的那么就变成了x12x01x00x34,无法作为十六进制的数据来进行处理

std::string str = R"({
    {
        "name": "mssql",
        "probestring": "\x12\x01\x00\x34",
        "pattern": ["MSSQLServer", "^\\x04\\x01\\x00\\x25\\x00\\x00\\x01\\x00\\x00\\x00\\x15"],
        "port": ["1433"]
    }
})";

如果改成如下,那么json中取出来的就是\x12\x01\x00\x34,输出的话,默认string不会将其作为十六进制,而是单纯的字符来输出

std::string str = R"({
    {
        "probestring": "\\x12\\x01\\x00\\x34",
    }
})";

所以这里就写了一个string转byte的,根据nmap的指纹库考虑了下,有三种情况

1、probestring中是十六进制的数据

2、probestring中是字符的数据

3、probestring中有十六进制的数据,又有字符的数据

BYTE str2byte(const string &str)
{
	BYTE bRet = 0x00;	//结果
	size_t iPos = 1;	//位
	size_t power = 1;	//幂次

	//没找的"x"返回
	/*
	if (std::string::npos == str.find("x"))
	{
	return false;
	}*/

	//从右往左依次取每个字符
	while (str.find("x") != (str.length() - iPos))
	{
		char cVal = str[str.length() - iPos];
		int iVal = int(cVal);

		//0~9
		if ((iVal >= 48) && (iVal <= 57))
		{
			bRet += ((iVal - 48) * power);
		}
		//A~F
		else if ((iVal >= 65) && (iVal <= 70))
		{
			bRet += ((iVal - 55) * power);
		}
		//a~f
		else if ((iVal >= 97) && (iVal <= 102))
		{
			bRet += ((iVal - 87) * power);
		}

		++iPos;
		power *= 16;
	}

	return bRet;
}

string getProbeString(const string& jsonString){
	string finaString;
	string tempString;

	if (jsonString.empty()){
		finaString = "";
		return finaString;
	}

	finaString.resize(jsonString.size()); //默认初始化先为最大,后面来进行调整

	DWORD dwIndex = 0;
	DWORD i = 0, j;
	DWORD dwStringSize = 0;
	while (i < jsonString.size()){
		// 每次取两个字符
		tempString = jsonString.substr(i, 2);

		// 判断是否为存在 \x 这两个字符
		if (tempString.find("\\x") != string::npos){
			// 如果存在那么将 加上这2个字符的总共4个字符进行转化为十六进制
			tempString = jsonString.substr(i, 4);
			finaString[dwIndex] = str2byte(tempString);
			dwIndex++;

			i += 4; // 偏移+4
			dwStringSize++; // 容器大小+1个字节大小
		}
		else{
			// 如果没有那么当前这两个字符就是普通字符
			for (j = 0; j < 2; j++, dwIndex++)
			{
				finaString[dwIndex] = tempString[j];
			}

			i += 2; // 偏移+2
			dwStringSize += 2; // 容器大小+2个字节大小
		}
	}

	finaString.resize(dwStringSize);
	return finaString;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM