Bonjour,
Je voudrai parser un flux binaire qui peut etre l'entrée standard un fichier ou une file (mkfifo).
Dans ce flux, il y a des syncword (0x000001) qu'il faut que j'intercepte pour traiter les quelques octets suivants, ces syncword ont un espacement non-fixe qui peut être entre 5 octets et plusieurs Mo.
j'ai essayé de mettre en place un système de buffer dans lequel je recherche le syncword. Seulement dans ce buffer il peut très bien n'y en avoir aucun comme plusieurs dizaines.
j'ai testé naïvement ceci:
Ou start_pos est utilisé en pour décaler la recherche dans le buffer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int search(const std::vector<char> &word, const uint start_pos) { if( (start_pos >= m_buffer_size) || (start_pos >= m_stream->gcount()) ) return -1; std::vector<char>::iterator it; it = std::search(m_buffer.begin()+start_pos, m_buffer.begin()+m_buffer_size, word.begin(), word.end()); if( it != m_buffer.end() ) return (it-m_buffer.begin()); else return -1; }
Cela fonctionne plutôt pas mal seulement je ne sais pas comment gérer de manière élégante le cas ou un syncword se retrouve à la fin du buffer, aux 3 derniers octets par exemple, si je veux pouvoir traiter les octets suivants je dois a nouveau remplir le buffer.
Si quelqu’un connaît une solution élégante pour ce genre de choses
ps: impossible d'utiliser du C++11 ou supérieur ainsi que boost
Partager