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