2010-10-10 7 views
2

je la macro c suivant du plugin Yahoo libpurple:C macro à C++ Qt

#define yahoo_put16(buf, data) (\ 
     (*(buf) = (unsigned char)((data)>>8)&0xff), \ 
     (*((buf)+1) = (unsigned char)(data)&0xff), \ 
     2) 

Je veux mettre en œuvre la même en fonction de ma sorcière de classe recevrait comme paramètre une valeur quint16 et le retourner comme un QByteArray J'ai le suivant mais je ne semble pas obtenir le même résultat qu'avec la macro ci-dessus.

QByteArray YahooPacket::packQuint16(quint16 value) const 
{ 
    QByteArray data; 

    data.append(QByteArray::number((value >> 8) & 0xFF)); 
    data.append(QByteArray::number(value & 0xFF)); 

    return data; 
} 

Comment ferais-je pour implémenter ma fonction?

Répondre

2

QByteArray::number() crée la version imprimable (chaîne) du nombre qui n'est probablement pas ce que vous voulez. Utilisez le constructeur QByteArray qui prend un pointeur de tampon et un paramètre de taille. Je pense que cela fera ce que tu veux.

QByteArray YahooPacket::packQuint16(quint16 value) const 
{ 
    QByteArray data; 

    data.append(QByteArray(((char*)&value)+1,1)); 
    data.append(QByteArray((char*)&value,1)); 

    return data; 
} 
+0

Une idée de pourquoi ils n'ont pas utilisé la même chose, de lancer le pointeur sur l'adresse de valeur et de lire les 8 derniers bits et les 8 premiers bits? Pourquoi ont-ils utilisé le décalage de bit sur la valeur et ensuite & 0xFF? – daniels

+0

C'est une bonne question. J'espère n'avoir pas mal interprété ce qu'ils font. –

+0

Non, vous n'avez pas mal interprété. Votre version donne le même résultat que la leur et la vôtre a l'air plus belle et plus propre. Il semble que ce qu'ils faisaient n'était que l'endianisme. Dommage qu'ils n'aient pas mis cela dans un commentaire, j'aurais su dès le début ce qu'il fallait chercher. J'ai fini par utiliser QDataStream et setByteOrder pour écrire dans QByteArray. – daniels