Salut à tous et à toutes !
J'utilise actuellement dans un petit projet sf::Packet pour balader des données entre un PC et une carte ARM (encore et toujours
).
J'ai constaté (après un long arrachage de cheveux) que l'utilisation de données d'une taille impair emmêle l'extraction.
Exemple :
sf::Packet pac;
pac <<< u8 << u16 << u16 << u16 << u16; // erreur extraction
pac << u8 << u8 << u16 << u16 << u16 << u16; // OK
pac << u16 << u16 << u16 << u16 << u16; // OK
Ce problème semble du à l'alignement mémoire de l'ARM9 qui se comporte différemment suivant l'accès à un pointeur pair ou impair pour des données ayant une taille supérieure à 1.
Je me demandais donc s'il s'agit d'un "problème" connue (si on peut parler de problème) ?
Pour l'instant, j'ai résolu le problème de 2 façons : soit en n'envoyant que des données de taille paire, soit en 'patchant' l'extraction de sf::Packet
Packet& Packet::operator >>(Uint16& data)
{
if (checkSize(sizeof(data)))
{
data = ntohs((Uint16)(m_data[m_readPos]) + (Uint16)(m_data[m_readPos+1] << 8)
//data = ntohs(*reinterpret_cast<const Uint16*>(&m_data[m_readPos]));
m_readPos += sizeof(data);
}
return *this;
}
Cela ajoute un léger overhead (une mesure rapide me donne 0.01% de charge en plus côté ARM9). Je me demande s'il existe une manière plus adapté de résoudre ce souci ?