DeepSiderZ a dit : "Oui, il utilise actuellement une std::list de char pour stocker son packet, ce qui lui évite de redimensionner son tableau à chaque ajout de donné. Mais je lui ai dit de faire un char tab[8192] vu qu'aucun paquet n'est plus grand."
Aucun paquet n'a de taille supérieur a 8192 mais tout les paquets ne font pas non plus cette taille. Lorsqu'un paquet fait moins de 8192 octets il est préférable d'utiliser une liste ou un vecteur niveau optimisation de la mémoire. D'autant plus qu'une liste ou un vecteur est un objet il est donc automatiquement détruit lorsqu'il n'est plus utiliser contrairement a un char * allouer avec new et qu'il faut delete.
C'est juste une question d'optimisation en réalité.
Sinon j'ai avancé sur le writter. Je suis passer sur un vecteur plutôt qu'une liste pour plus de simplicité dans le déplacement (pour la fonction pack()).
Je pense avoir codé toutes les fonctions nécessaire/utiles mais je ne suis pas sur de toute les avoir.
Que pensez-vous du writter ? Voyez-vous des améliorations possible ou des erreurs dans le code ?
#include "D2Writer.h"
D2Writer::D2Writer()
{
this->byteList.clear();
}
D2Writer::~D2Writer()
{
}
int D2Writer::getTailleType()
{
if (this->byteList.size() > 65535)
return (3);
if (this->byteList.size() > 255)
return (2);
if (this->byteList.size() > 0)
return (1);
return (0);
}
short D2Writer::getHeader(int id)
{
return ((short)((id << 2) | this->getTailleType()));
}
void D2Writer::writeByte(char v)
{
this->byteList.push_back((char)(v));
}
void D2Writer::writeShort(short s)
{
this->byteList.push_back((char)(s >> 8));
this->byteList.push_back((char)(s));
}
void D2Writer::writeUShort(unsigned short s)
{
this->byteList.push_back((char)(s >> 8));
this->byteList.push_back((char)(s));
}
void D2Writer::writeInt(int s)
{
this->byteList.push_back((char)(s >> 24));
this->byteList.push_back((char)(s >> 16));
this->byteList.push_back((char)(s >> 8));
this->byteList.push_back((char)(s));
}
void D2Writer::writeUInt(unsigned int s)
{
this->byteList.push_back((char)(s >> 24));
this->byteList.push_back((char)(s >> 16));
this->byteList.push_back((char)(s >> 8));
this->byteList.push_back((char)(s));
}
void D2Writer::writeString(std::string &str)
{
for (std::string::iterator it = str.begin(); it != str.end(); ++it)
this->byteList.push_back((char)((*it)));
}
void D2Writer::writeBool(bool b)
{
if (b)
this->byteList.push_back(1);
else
this->byteList.push_back(0);
}
char *D2Writer::packByte(int id)
{
int i = 0;
int taille = this->byteList.size();
int tailleType = this->getTailleType();
short h = this->getHeader(id);
char *paquet = new char[2 + tailleType + taille];
paquet[0] = (char)(h >> 8);
paquet[1] = (char)(h - 256 * paquet[0]);
switch(tailleType)
{
case 1:
paquet[2] = (char)(tailleType);
i = 3;
break;
case 2:
paquet[2] = (char)(tailleType >> 8);
paquet[3] = (char)(tailleType - 256 * paquet[2]);
i = 4;
break;
case 3:
paquet[2] = (char)(tailleType >> 16);
paquet[3] = (char)(tailleType >> 8);
paquet[4] = (char)(tailleType - 256 * paquet[3] - 256 * paquet[2]);
i = 5;
break;
}
for (int j = i; j < i + tailleType; j++)
paquet[j] = this->byteList.at(j - i);
return (paquet);
}
Merci d'avance.
Cordialement,
Kangogoo.