2017-05-17 5 views
1

Ok, donc j'ai un morceau de code. Cela va insérer le contenu de l'en-tête dans un tampon:C++: Lorsque j'attribue les valeurs à un tampon, cela ne fonctionne pas

buffer = (uint8_t*)malloc(totalSize); 
buffer[0] = ((header.sequenceNumber >> 24) & 0xFF); 
buffer[1] = ((header.sequenceNumber >> 16) & 0xFF); 
buffer[2] = ((header.sequenceNumber >> 8) & 0xFF); 
buffer[3] = (header.sequenceNumber & 0xFF); 
buffer[4] = ((header.ackNumber >> 24) & 0xFF); 
buffer[5] = ((header.ackNumber >> 16) & 0xFF); 
buffer[6] = ((header.ackNumber >> 8) & 0xFF); 
buffer[7] = (header.ackNumber & 0xFF); 
buffer[8] = ((header.connectionId >> 8) & 0xFF); 
buffer[9] = (header.connectionId & 0xFF); 
buffer[10] = (0 & 0xFF); 
unsigned i = (((unsigned)header.ack) << 2) + (((unsigned)header.syn) << 1) + (unsigned)header.fin; 
buffer[11] = (i & 0xFF); 

, et le contenu du tampon est complètement faux. J'ai essayé de déboguer en ajoutant ce morceau de code:

std::cerr << "DEBUG: Values are: " 
    << ((header.sequenceNumber >> 24) & 0xFF) << ", " 
    << ((header.sequenceNumber >> 16) & 0xF) << ", " 
    << ((header.sequenceNumber >> 8) & 0xFF) << ", " 
    << (header.sequenceNumber & 0xFF) << ", " 
    << ((header.ackNumber >> 24) & 0xFF) << ", " 
    << ((header.ackNumber >> 16) & 0xFF) << ", " 
    << ((header.ackNumber >> 8) & 0xFF) << ", " 
    << (header.ackNumber & 0xFF) << ", " 
    << ((header.connectionId >> 8) & 0xFF) << ", " 
    << (header.connectionId & 0xFF) << ", " 
    << (0 & 0xFF) << ", " 
    << (i & 0xFF) << endl; 

std::cerr << "DEBUG: Buffer header is: " 
    << buffer[0] << ", " << buffer[1] << ", " << buffer[2] << ", " 
    << buffer[3] << ", " << buffer[4] << ", " << buffer[5] << ", " 
    << buffer[6] << ", " << buffer[7] << ", " << buffer[8] << ", " 
    << buffer[9] << ", " << buffer[10] << ", " << buffer[11] << endl; 

std::cerr << "DEBUG: getBuffer ends. The size is " << totalSize 
    << ". The buffer is " << buffer << endl; 

Et cela est montré dans la console:

DEBUG: Values are: 0, 0, 48, 57, 0, 0, 0, 0, 0, 0, 0, 2 
DEBUG: Buffer header is: , , 0, 9, , , , , , , , 
DEBUG: getBuffer ends. The size is 12. The buffer is 

Les 12 valeurs sont correctes. Mais les 12 éléments du tampon sont complètement faux.

+0

malloc? Vous écrivez C++. Utilisez std :: vector. –

Répondre

1

Je suppose que le contenu de la mémoire tampon est correct, mais que votre façon de le signaler à stderr échoue.

std::cerr << "DEBUG: Buffer header is: " 
      << buffer[0]; 

écrit un uint8_t stderr (si buffer est de type uint8_t*), mais c'est juste un unsigned char et utilise ainsi le codage ASCII. Pour obtenir la valeur entière correcte, utilisez

std::cerr << "DEBUG: Buffer header is: " 
      << int(buffer[0]); 
+0

Génial. Je l'ai changé un peu, à (int) buffer [0], et ça marche. – NormalGuy

+0

@NormalGuy Glad a aidé. Btw, 'int (buffer [0])' est le style C++, '(int) buffer [0]' est mauvais vieux style C et non recommandé (mais vous semblez être un hacker C étant donné votre utilisation de 'malloc () '). – Walter