前言:某個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;
}