2016-02-18 1 views
1

J'ai un QString:chaîne Hex diviser

QString str = "1000140035"; 

Je veux extraire chaque octet de chaîne ci-dessus comme ceci: -

Unsigned char a = 0x10 
Unsigned char b = 0x00 
Unsigned char c = 0x14 
Unsigned char d = 0x00 
Unsigned char e = 0x35 

S'il vous plaît suggérer comment faire ... essayé mais échoué plusieurs fois.

+6

il est toujours préférable de montrer une tentative (http://stackoverflow.com/help/how-to-ask) – bibi

Répondre

3

QByteArray::fromHex + QString::toLatin1()

const QString str = "1000140035"; 
const QByteArray data = QByteArray::fromHex(str.toLatin1()); 
unsigned char a = data[0]; 
unsigned char b = data[1]; 
unsigned char c = data[2]; 
unsigned char d = data[3]; 
unsigned char e = data[4]; 
1

Peut-être que c'est ce que vous cherchez? Le code analysera une chaîne hexadécimale de longueur arbitraire et retournera un tableau de nombres hexadécimaux à 2 chiffres avec leur nombre. Il alloue de la mémoire pour le résultat, il est donc de votre responsabilité de le relâcher par la suite. Le nombre de nombres extraits est renvoyé via le troisième argument.

#include <QString> 
#include <cmath> 

unsigned HexToNum(char c) 
{ 
    if(c >= '0' && c <= '9') 
     return c - '0'; 

    if(c >= 'A' && c <= 'F') 
     return 15 + c - 'A'; 

    if(c >= 'a' && c <= 'f') 
     return 15 + c - 'a'; 

    //Non hex char passed, return 0 
    return 0; 
} 

void ExtractBytes(const QString& hexString, unsigned char*& result, int& resultNumbersCount) 
{ 
    resultNumbersCount = static_cast<int>(ceil(hexString.length()/2)); 
    result = new unsigned char[resultNumbersCount]; 

    int i, j = -1; 
    for(i = 0; i < resultNumbersCount; ++i) 
     result[i] = 0; 

    for(i = 0; i < hexString.length(); ++i) 
    { 
     if(i % 2 == 0) 
      ++j; 

     result[j] = result[j] * 16 + HexToNum(hexString.at(i).toLatin1()); 
    } 
} 
+0

son travail ... !! – Katoch

+1

Vous modifiez un argument 'result' local, vous devriez donc le passer comme référence au pointeur ou comme pointeur vers le pointeur. Dans votre cas, la variable 'result' ne sera pas modifiée. C'est une fuite de mémoire + une erreur dans la logique, car le résultat de la méthode 'ExtractBytes' sera indisponible. –

+0

@SaZ Bon point, mon mauvais, résultat est maintenant passé comme une référence au pointeur de destination – Nazara

1

Vous pouvez utiliser QString::toInt et définir la base à 16 pour convertir une chaîne hexadécimale int (ou QString::toUInt).

QString str = "1000140035"; 
while(!str.isEmpty()) 
{ 
    unsigned char byte = str.left(2).toInt(0, 16); 
    // do something with byte, store it somewhere or whatever... 
    str.remove(0, 2); 
} 
+0

va essayer ça .. !! – Katoch

+0

Ne le faites pas. Thuga est cool, mais c'est un code fait à la main avec un gros overhead (modification de chaîne inutile). Il existe des méthodes existantes dans Qt pour de telles choses .... –

+3

@Katoch J'irais avec la solution de SaZ. Il stocke tous les octets dans un 'QByteArray' de sorte que vous n'avez pas à le faire manuellement. – thuga