2014-07-24 2 views
0

Ok J'ai une question en deux parties sur la conversion d'un élément dans un QByteArray (devrait être un caractère de droit?) En un entier non signé.qbytearray.at() à unsigned int

Voici mon code:

QByteArray data_read_buffer; 

unsigned int data_recieved_size = 0; 

/* the code below is an external function that populates the QbyteArray. shouldn't be important putting only to show that I assign a value to the byteArray./* 

readFromComPortSafe(data_read_buffer); 

data_recieved_size = static_cast<unsigned int>((data_read_buffer.at(2))); 

Ok. Donc le résultat que je récupère dans data_recieved_size est faux "de temps en temps" je vais dans le débogueur et quand j'inspecte la valeur de data_read_buffer je reçois ceci:

\ 000 \ 003 \ 203 \ 00 \ 205. ... (ect ect nous avec un certain caractère avec tréma)

Lorsque j'inspecte la valeur de data_recieved_size i get 4294967171

donc, ma première question est

Ai-je fait quelque chose de mal avec la conversion de un char à un int non signé?

Ma deuxième question est la suivante:

Qu'est-ce que \ 203 représentent dans le QByteArray Je suppose que je ne comprends pas ce que je regarde?. Je comprends que le type de caractère est un caractère Unicode ???? Je m'attendais à ce que le deuxième élément dans le QByteArray soit 0x83 ou 131. Comment cela se traduit-il en \ 203?

Si quelqu'un pouvait donner un aperçu sur celui-ci, je l'apprécierais.

Merci

Répondre

0

char s peuvent être signés ou non signés en fonction de votre plate-forme, dans votre cas, ils sont signés.

Pensez à ce qui se passe lorsque vous appelez data_read_buffer.at et la valeur de retour est -125:

  • -125 comme char est 0x83
  • Cette valeur est ensuite convertie en une int à l'intérieur du static_cast, à savoir 0xffffff83
  • static_cast envoie maintenant cette valeur à unsigned int, qui copie simplement les bits (bien sur les machines à complément de deux) au moins).
  • 0xffffff83 comme unsigned int est 4.294.967.171

Si vous voulez lancer à unsigned int et éviter l'extension de signe, vous aurez besoin de faire quelque chose comme

static_cast<unsigned int>(static_cast<unsigned char>(data_read_buffer.at(2))); 
+0

Merci. Ça a du sens maintenant. – user254340

0

Le type char est habituellement signé. Bien que cela ne soit pas évident, vous l'élargissez à 32 bits en tant que valeur signée, puis réinterprétez cette valeur comme une valeur non signée. Si vous insérez un static_cast< unsigned char >, vous allez élargir une valeur non signée.

Questions connexes