2017-08-09 5 views
1

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é

+0

Est-ce que la séparation de 2 bye 2 et l'insertion dans la matrice est suffisante? – aghilpro

+0

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

+0

@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

Répondre

2

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.

+0

Merci! Oui, je vérifie d'abord que la chaîne QString est une chaîne hexadécimale valide. – MABC

+0

Ou convertissez une fois 'toULongLong' et ignorez les 16 premiers bits car ils sont nuls. – MSalters

1

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); 
} 
+0

Merci! Cela fonctionne aussi – MABC

0

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; 
} 
0

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; 
} 
+0

Seulement pour les machines 64 bits longtemps long est 64 bits à droite? – MABC

+0

@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