void hexStringToBytes(unsigned char* srcData, unsigned char* destData, uint32_t hexDigits) { lassert(hexDigits % 2 == 0); for (long k = 0; k < hexDigits;k += 2) destData[k/2] = hexCharValue(srcData[k]) * 16 + hexCharValue(srcData[k+1]); }
// read string at file pos bool CJson:: readString(CStrParse &parse, std::string &str1) { if (! parse.isChar('\"')) return false; parse.skipChar(); while (! parse.eof()) { if (parse.isChar('\\') && ! parse.neof(1)) { parse.skipChar(); char c = parse.readChar(); switch (c) { case '\"': str1 += '\"'; break; case '\\': str1 += '\\'; break; case '/' : str1 += '/' ; break; case 'b' : str1 += '\b'; break; case 'f' : str1 += '\f'; break; case 'n' : str1 += '\n'; break; case 'r' : str1 += '\r'; break; case 't' : str1 += '\t'; break; case 'u' : { // 4 hexadecimal digits long i = 0; for (int j = 0; j < 4; ++j) { if (! parse.isXDigit()) return false; char c = parse.readChar(); i = (i << 4) | (hexCharValue(c) & 0xF); } CUtf8::append(str1, i); break; } default: { if (isStrict()) return false; str1 += c; break; } } } else if (parse.isChar('\"')) break; else str1 += parse.readChar(); } if (parse.eof() || ! parse.isChar('\"')) return false; parse.skipChar(); return true; }