2012-06-05 4 views
0

J'ai un problème avec l'analyse du contenu d'un char []. Il contient des octets, qui peuvent être formatés comme des piqûres ASCII. Les deux derniers octets sont cependant CRC. Par conséquent, je tout interprète, mais les deux dernières entrées dans le tableau en hexadécimal à chaîne:Parse unsigned char [] à std :: string

std::ostringstream payload; 
std::ostringstream crc; 
payload << std::hex; 
crc << std::hex; 

// last two bytes are CRC 
for (int i = 0; i < this->d_packetlen - 2; i++) 
    { 
    payload << static_cast<unsigned>(this->d_packet[i]); 

    for (int j = i; j < this->d_packetlen; i++) 
     { 
     crc << static_cast<unsigned>(this->d_packet[j]); 
     } 
} 
std::string payload_result = payload.str(); 
std::string crc_result = crc.str(); 

fprintf(d_new_fp, "%s, %s, %d, %d\n", payload_result.c_str(), 
    crc_result.c_str(), this->d_lqi, this->d_lqi_sample_count); 

Cela ne fonctionne pas, et je ne suis pas sûr pourquoi? Existe-t-il un moyen plus simple de convertir des caractères non-chiffrés en caractères ASCII?

Best, Marius

+3

Définir "ne fonctionne pas". Ne compile pas? Ne pas lier? Ne fonctionne pas? Fonctionne mais produit de mauvais résultats? –

+0

Il génère des déchets. Certainement pas ASCII, mais c'est mon objectif ici. Il y a cependant des valeurs ASCII formées par octets. – wishi

+0

'Les caractères non signés sont des caractères ASCII ou des caractères non-ASCII, qui ne peuvent pas être convertis en caractères ASCII. – Gandaro

Répondre

3

Ceci est une boucle infinie:

for (int j = i; j < this->d_packetlen; i++) 
{ 
    crc << static_cast<unsigned>(this->d_packet[j]); 
} 

Dans cette boucle, vous n'êtes pas incrémentez j; Au lieu de cela, vous incrémentez i. Peut-être, c'est le problème?


De plus, la façon dont vous avez décrit le problème, je pense que la bonne solution est la suivante:

for (int i = 0; i < this->d_packetlen - 2; i++) 
{ 
    payload << static_cast<unsigned int>(this->d_packet[i]); 
} 
for (int j = this->d_packetlen - 2; j < this->d_packetlen; j++) 
{ 
    crc << static_cast<unsigned int>(this->d_packet[j]); 
} 

C'est la deuxième boucle doit être en dehors de la première boucle.

2

Je pense que le problème est que vos incréments de boucle imbriquées i au lieu de j.

for (int i = 0; i < this->d_packetlen - 2; i++) 
{ 
payload << static_cast<unsigned>(this->d_packet[i]); 

    for (int j = i; j < this->d_packetlen; i++ /* <=== HERE */) 
    { 
     crc << static_cast<unsigned>(this->d_packet[j]); 
    } 
}