Une chaîne QString avec une entrée utilisateur contient une adresse MAC, par exemple "68F542F9AB22"
. J'ai besoin de convertir la chaîne QString en un tableau char non signé [6], et non la représentation ASCII. Donc, pour le QString 68F542F9AB22
le tableau unsigned char à première position doit être 104.Représentation QString hexadécimale dans un tableau char non signé
Répondre
vous pouvez itérer sur votre QString et le couper en morceaux de deux, puis utiliser QString :: toUShort (& ok, 16), qui vous donnera un hhort de votre chaîne hexagonale.
someting comme
for(int i=0;i<6;++i)
{
QString hexString = yourstring.mid(i*2,2);
bool ok = false;
yourBuf[i] = (unsigned char) hexString.toUShort(&ok,16);
//if not ok, handle error
}
Vous faites des vérifications qui devraient pour la bonne longueur de votre chaîne d'entrée et de faire une erreur de manipulation sur les erreurs de conversion.
Espérons que cela pourrait vous aider.
je le ferais de la façon suivante:
QString s("68F542F9AB22");
assert(s.size() % 2 == 0);
std::vector<unsigned char> array;
for (int i = 0; i < s.size(); i += 2)
{
QString num = s.mid(i, 2);
bool ok = false;
array.push_back(num.toUInt(&ok, 16));
assert(ok);
}
Merci! Cela fonctionne aussi – MABC
Vous pouvez essayer:
QString s = "68F542F9AB22";
unsigned char array[6];
if (s.length() % 2 == 0) { // test string length is even
for (unsigned long i = 0 ; i < s.length() ; i += 2) {
QString chunk = s.mid(i,2);
bool ok;
array[i/2] = static_cast<unsigned char>(chunk.toInt(&ok,16));
}
}
Notez que le code ci-dessus ne fonctionne que même pour les chaînes (mais pour l'adresse MAC, il est ok) .
Et pour tester le résultat que vous pouvez utiliser:
for (unsigned long i = 0 ; i < 6 ; i ++) {
std::cout<<"Array ["<<i<<"] = "<<static_cast<unsigned long>(array[i])<<std::endl;
}
Hex à long long
est une opération simple et vous permet de convertir jusqu'à 64 bits. C'est suffisant pour un MAC 48 bits. Donc:
bool ok = false;
auto result = input.toULongLong(&ok,16);
for(int i=5;i>=0;--i)
{
buf[i] = result & 0xFF;
result >>= 8;
}
Seulement pour les machines 64 bits longtemps long est 64 bits à droite? – MABC
@MABC: C'est au moins 64 bits. Sur une machine 64 bits, vous pourriez trouver 'long' est 64 bits et' long long' pourrait alors être 128 bits. Ce code repose uniquement sur la taille minimale, pas la taille exacte. – MSalters
Est-ce que la séparation de 2 bye 2 et l'insertion dans la matrice est suffisante? – aghilpro
Vous voulez dire utiliser QString :: at (position int) pour obtenir le QChar, puis essayer de le convertir en int et l'insérer dans le tableau ?. Je cherche un moyen plus facile. – MABC
@MABC quelque chose comme ça. Pourquoi avez-vous besoin de MAC comme ça? Peut-être qu'il y a une autre solution pour vous. – aghilpro