Attention s'il vous plaît:C++ stl: une bonne façon d'analyser une réponse du capteur
Je l'ai déjà mis en œuvre ce genre de choses, mais pas d'une façon générique ou élégante. Cette question est motivée par mon désir d'apprendre plus de trucs avec le stl, pas le problème lui-même.
Ce que je pense est clair dans la façon dont je l'ai dit que je l'ai déjà résolu le problème, mais beaucoup de gens ont répondu dans leurs meilleures intentions avec des solutions au problème , pas de réponses à la question « comment résoudre ce la façon stl ". Je suis vraiment désolé si j'ai formulé cette question d'une manière confuse. Je déteste perdre le temps des gens.
Ok, le voici:
je reçois une chaîne complète de données codées.
Il est disponible en: N >> 64 octets
- tous les 3 octets se décodées en une valeur int
- après au plus 64 octets (! Oui, non divisible par 3) vient un octet comme Somme de contrôle
- suivi d'un saut de ligne.
- et ainsi de suite.
Il se termine lorsque 2 sauts de ligne successifs sont trouvés.
Il ressemble à un format de données agréable ou au moins ok, mais en l'analysant avec élégance la façon stl est un peu **.
J'ai fait la chose "manuellement".
Mais je serais intéressé s'il y a une manière élégante avec la stl- ou peut-être la magie de boost que n'incorpore pas la copie la chose.
Clarification: Il devient parfois très gros. Le N >> 64 octets était plus comme un N de 64 octets ;-)
MISE À JOUR Ok, N> 64 octets semble être source de confusion. Ce n'est pas important.
- Le capteur prend des mesures M comme nombres entiers. Encode chacun d'eux en 3 octets. et les envoie l'un après l'autre
- lorsque le capteur a envoyé 64 octets de données, il insère une somme de contrôle sur le 64 octet et un LF. Il ne se soucie pas si l'un des entiers codés est "cassé" par cela. Cela continue juste dans la ligne suivante. (Cela a seulement pour effet de rendre les données joliment lisibles par l'homme, mais plutôt désagréables à analyser élégamment.)
- si elle a terminé l'envoi de données insère une somme de contrôle octets et LFLF
donc un bloc de données peut ressembler à ceci, N = 129 = 43x3:
|<--64byte-data-->|1byte checksum|LF
|<--64byte-data-->|1byte checksum|LF
|<--1byte-data-->|1byte checksum|LF
LF
Quand j'ai M = 22 mesures, cela signifie que j'ai N = 66 octets de données. Après 64 octets, il insère la somme de contrôle et LF et continue. De cette façon, il rompt ma dernière mesure qui est codée dans les octets 64, 65 et 66. Il ressemble maintenant à ceci: 64, somme de contrôle, LF, 65, 66. Puisqu'un multiple de 3 divisé par 64 porte un résidu 2 sur 3 fois, et à chaque fois, il est méchant d'analyser. Je avait 2 solutions:
- contrôle de vérification, les données concaténer une chaîne qui ne dispose que d'octets de données, decode.
- traversée par des itérateurs et une construction si mauvaise pour éviter la copie.
Je pensais juste qu'il pourrait y avoir quelque chose de mieux. Je pensais à propos de std :: transform, mais ça ne marcherait pas car le 3 octets est une chose int.
Ceci n'est toujours pas clair. a) Quelle est la taille maximale de l'ensemble des données, en octets? b) est la taille maximale des données dans chaque enregistrement 64 octets comme vous le dites ici, ou vraiment grand, comme l'indique votre commentaire à ma réponse - si ce dernier, quelle taille? –
Vos données de mesure et votre somme de contrôle sont-elles binaires ou ascii? Si les données de mesure sont binaires, quelle est leur endianness? –
Comment recevez-vous vos données de capteur? Un port série? Une prise réseau? Un fichier? Êtes-vous obligé de lire tout le bloc de données du capteur en une fois? –