| 195 | } |
| 196 | |
| 197 | QByteArray variantToByteArray(QVariant value, QHexFindMode mode, |
| 198 | unsigned int options) { |
| 199 | QByteArray v; |
| 200 | |
| 201 | switch(mode) { |
| 202 | case QHexFindMode::Text: |
| 203 | if(QHEXVIEW_VARIANT_EQ(value, String)) |
| 204 | v = value.toString().toUtf8(); |
| 205 | else if(QHEXVIEW_VARIANT_EQ(value, ByteArray)) |
| 206 | v = value.toByteArray(); |
| 207 | break; |
| 208 | |
| 209 | case QHexFindMode::Hex: { |
| 210 | if(QHEXVIEW_VARIANT_EQ(value, String)) { |
| 211 | qint64 len = 0; |
| 212 | auto s = value.toString(); |
| 213 | if(!PatternUtils::check(s, len)) |
| 214 | return {}; |
| 215 | |
| 216 | bool ok = true; |
| 217 | |
| 218 | #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) |
| 219 | for(auto i = 0; ok && i < s.size(); i += 2) |
| 220 | v.push_back(static_cast<char>( |
| 221 | QStringView{s}.mid(i, 2).toUInt(&ok, 16))); |
| 222 | #else |
| 223 | for(auto i = 0; ok && i < s.size(); i += 2) |
| 224 | v.push_back( |
| 225 | static_cast<char>(s.midRef(i, 2).toUInt(&ok, 16))); |
| 226 | #endif |
| 227 | |
| 228 | if(!ok) |
| 229 | return {}; |
| 230 | } |
| 231 | else if(QHEXVIEW_VARIANT_EQ(value, ByteArray)) |
| 232 | v = value.toByteArray(); |
| 233 | break; |
| 234 | } |
| 235 | |
| 236 | case QHexFindMode::Int: { |
| 237 | bool ok = false; |
| 238 | uint val = value.toUInt(&ok); |
| 239 | if(!ok) |
| 240 | return QByteArray{}; |
| 241 | |
| 242 | QDataStream ds(&v, QIODevice::WriteOnly); |
| 243 | |
| 244 | if(options & QHexFindOptions::BigEndian) { |
| 245 | if(options & QHexFindOptions::Int8) |
| 246 | ds << qToBigEndian<quint8>(val); |
| 247 | else if(options & QHexFindOptions::Int16) |
| 248 | ds << qToBigEndian<quint16>(val); |
| 249 | else if(options & QHexFindOptions::Int32) |
| 250 | ds << qToBigEndian<quint32>(val); |
| 251 | else if(options & QHexFindOptions::Int64) |
| 252 | ds << qToBigEndian<quint64>(val); |
| 253 | else |
| 254 | return variantToByteArray(value, mode, |