From 79c1b19e33b78531d9d75f91946e5e2eb0952c80 Mon Sep 17 00:00:00 2001 From: Mario Fink Date: Tue, 9 Feb 2021 16:40:11 +0100 Subject: [PATCH] check block consistency, reset block.end for length that exceeds buffer size (e.g. final CS) --- lib/imc_block.hpp | 17 +++++++++++++++-- lib/imc_raw.hpp | 31 +++++++++++++++++++++++++------ smp/exampleA.raw | 6 +++++- smp/exampleB.raw | 17 ++++++++++++++++- 4 files changed, 61 insertions(+), 10 deletions(-) diff --git a/lib/imc_block.hpp b/lib/imc_block.hpp index fa70261..bea9d58 100644 --- a/lib/imc_block.hpp +++ b/lib/imc_block.hpp @@ -104,7 +104,20 @@ namespace imc raw_file_ = raw_file; buffer_ = buffer; - parse_parameters(); + // make sure "end_" does not exceed buffer size due to invalid "length" parameter of block + if ( end_ > buffer_->size() ) + { + std::cout<<"WARNING: invalid length parameter in "<size()<<")" + <<" => resetting block-end to buffer-size\n"; + end_ = buffer_->size(); + } + + try { + parse_parameters(); + } catch (const std::exception& e) { + throw std::runtime_error("block: failed to parse parameters"); + } } // identify/parse parameters in block @@ -158,7 +171,7 @@ namespace imc // summarize parameters in single string std::string prsstr("{"); for ( auto par: parameters_ ) prsstr += par.get_info() + std::string(","); - prsstr.pop_back(); + if ( prsstr.size() > 1 ) prsstr.pop_back(); prsstr += std::string("}"); // construct block info string diff --git a/lib/imc_raw.hpp b/lib/imc_raw.hpp index 458a0bf..27a4ac3 100644 --- a/lib/imc_raw.hpp +++ b/lib/imc_raw.hpp @@ -36,17 +36,17 @@ namespace imc // constructor raw() {}; - raw(std::string raw_file): raw_file_(raw_file) { this->parse(); }; + raw(std::string raw_file): raw_file_(raw_file) { this->parse_blocks(); }; // provide new raw-file void set_file(std::string raw_file) { raw_file_ = raw_file; - this->parse(); + this->parse_blocks(); } // list all blocks in buffer - void parse() + void parse_blocks() { // open file and put data in buffer try { @@ -64,7 +64,7 @@ namespace imc // start parsing raw-blocks in buffer for ( std::vector::iterator it=buffer_.begin(); - it!=buffer_.end(); ++it ) + it!=buffer_.end(); ++it ) { // check for "magic byte" if ( *it == ch_bgn_ ) @@ -113,8 +113,10 @@ namespace imc } else { - throw std::runtime_error( std::string("invalid block or corrupt buffer at byte: ") - + std::to_string(it+3-buffer_.begin()) ); + throw std::runtime_error( + std::string("invalid block or corrupt buffer at byte: ") + + std::to_string(it+3-buffer_.begin()) + ); } } else @@ -125,6 +127,23 @@ namespace imc } } + this->check_consistency(); + } + + // check consistency of blocks + void check_consistency() + { + for ( unsigned long int b = 0; b < this->rawblocks_.size()-1; b++ ) + { + if ( this->rawblocks_[b].get_end() >= this->rawblocks_[b+1].get_begin() ) + { + throw std::runtime_error( + std::string("inconsistent subsequent blocks:\n") + + std::to_string(b) + std::string("-th block:\n") + this->rawblocks_[b].get_info() + + std::string("\n") + + std::to_string(b+1) + std::string("-th block:\n") + this->rawblocks_[b+1].get_info() ); + } + } } // get blocks diff --git a/smp/exampleA.raw b/smp/exampleA.raw index d8ff185..c792eb4 100644 --- a/smp/exampleA.raw +++ b/smp/exampleA.raw @@ -1 +1,5 @@ -|CF,2,1,1;|CK,1,3,1,1;|NO,1,16,1,9,imc-FAMOS,0,;|CG,1,5,1,1,1;|CD,1,31,1.000000000000000E+0,1,0,,0,0,0;|NT,1,27, 3,11,1995,21,10,12.0000000; |CC,1,3,1,1;|CP,1,16,1,8,8,64,0,0,1,0;|Cb,1,41,1,0,1,1,0,8,0,8,1,0.000000000000000E+0,0,;|CR,1,11,0,0,0,1,1,V;|CN,1,36,0,0,0,10,Mittelwert,13,Meßreihe 0815; |CT,1,48,0,12,TxBearbeiter,24,E.Mustermann, 23.10.1995,0,; |CS,1,10,1,...ëQ ̧Î^@; +|CF,2,1,1;|CK,1,3,1,1;|NO,1,16,1,9,imc-FAMOS,0,;|CG,1,5,1,1,1; +|CD,1,31,1.000000000000000E+0,1,0,,0,0,0;|NT,1,27, 3,11,1995,21,10,12.0000000; +|CC,1,3,1,1;|CP,1,16,1,8,8,64,0,0,1,0;|Cb,1,41,1,0,1,1,0,8,0,8,1,0.000000000000000E+0,0,; +|CR,1,11,0,0,0,1,1,V;|CN,1,36,0,0,0,10,Mittelwert,13,Meßreihe 0815; +|CT,1,48,0,12,TxBearbeiter,24,E.Mustermann, 23.10.1995,0,; |CS,1,10,1,...ëQ ̧Î^@; diff --git a/smp/exampleB.raw b/smp/exampleB.raw index 68bf617..0d4fda6 100644 --- a/smp/exampleB.raw +++ b/smp/exampleB.raw @@ -1 +1,16 @@ -|CF,2,1,1;|CK,1,3,1,1;|NO,1,16,1,9,imc-FAMOS,0,;|CB,1,15,1,8,Messung1,0,;|CG,1,5,1,1,1;|CD,1,32,5.000000000000000E-1,1,1,s,0,0,0;|NT,1,27, 3,11,1995,21,24, 2.0000000; |CC,1,3,1,1;|CP,1,15,1,1,1,8,0,0,1,0;|Cb,1,41,1,0,1,1,0,3,0,3,1,3.000000000000000E+0,0,;|CR,1,49,1,3.921568627450980E-2,0.000000000000000E+0,1,1,V;|ND,1,50,-1,-1,-1,0.000000000000000E+0,1.000000000000000E+1;|CN,1,17,1,0,0,6,kanal1,0,;|CG,1,5,1,1,1;|CD,1,31,5.000000000000000E-1,1,0,,0,0,0;|NT,1,27, 3,11,1995,21,24, 6.0000000; |CC,1,3,1,1;|CP,1,15,2,1,1,8,0,0,1,0;|Cb,1,41,1,0,2,1,3,3,0,3,1,3.000000000000000E+0,0,;|CR,1,49,1,3.921568627450980E-2,0.000000000000000E+0,1,1,V;|ND,1,50,-1,-1,-1,0.000000000000000E+0,1.000000000000000E+1;|CN,1,17,1,0,0,6,kanal2,0,;|CS,1,8,1,leclass="Code Example" translate="true">|NO,1,37,1,9, imc-FAMOS,20,Erzeugt:E.Mustermann; |CG,1,5,2,2,2;|CD,1,31,1.000000000000000E-1,1,0,,0,0,0;|NT,1,27,10, 6,1993,19,18,20.0000000; |CC,1,3,1,1;|CP,1,16,1,4,7,32,0,0,1,0;|Cb,1,40,1,0,1,1,0,16,0,16,1,0.000000000000E+0,0,;|CR,1,11,0,0,0,1,1,V;|CN,1,20,0,0,0,9,E06_6_121,0,;|CC,1,3,2,1;|CP,1,16,2,4,5,32,0,0,1,0;|Cb,1,40,1,0,2,1,16,16,0,16,1,0.00000000000E+0,0,;|CR,1,49,1,1.000000024447218E-1,2.139131538569927E-8,1,1,s;|CS,1,34,1,ˆ D@ ƒ@,Ù•@H ¤@*Hh; +|CF,2,1,1;|CK,1,3,1,1;|NO,1,16,1,9,imc-FAMOS,0,;|CB,1,15,1,8,Messung1,0,; +|CG,1,5,1,1,1;|CD,1,32,5.000000000000000E-1,1,1,s,0,0,0;|NT,1,27, 3,11,1995,21,24, 2.0000000; +|CC,1,3,1,1;|CP,1,15,1,1,1,8,0,0,1,0;|Cb,1,41,1,0,1,1,0,3,0,3,1,3.000000000000000E+0,0,; +|CR,1,49,1,3.921568627450980E-2,0.000000000000000E+0,1,1,V; +|ND,1,50,-1,-1,-1,0.000000000000000E+0,1.000000000000000E+1;|CN,1,17,1,0,0,6,kanal1,0,; +|CG,1,5,1,1,1;|CD,1,31,5.000000000000000E-1,1,0,,0,0,0;|NT,1,27, 3,11,1995,21,24, 6.0000000; +|CC,1,3,1,1;|CP,1,15,2,1,1,8,0,0,1,0;|Cb,1,41,1,0,2,1,3,3,0,3,1,3.000000000000000E+0,0,; +|CR,1,49,1,3.921568627450980E-2,0.000000000000000E+0,1,1,V; +|ND,1,50,-1,-1,-1,0.000000000000000E+0,1.000000000000000E+1;|CN,1,17,1,0,0,6,kanal2,0,; +|CS,1,8,1,leclass="Code Example" translate="true"> +|NO,1,37,1,9, imc-FAMOS,20,Erzeugt:E.Mustermann; |CG,1,5,2,2,2; +|CD,1,31,1.000000000000000E-1,1,0,,0,0,0;|NT,1,27,10, 6,1993,19,18,20.0000000; +|CC,1,3,1,1;|CP,1,16,1,4,7,32,0,0,1,0;|Cb,1,40,1,0,1,1,0,16,0,16,1,0.000000000000E+0,0,; +|CR,1,11,0,0,0,1,1,V;|CN,1,20,0,0,0,9,E06_6_121,0,;|CC,1,3,2,1;|CP,1,16,2,4,5,32,0,0,1,0; +|Cb,1,40,1,0,2,1,16,16,0,16,1,0.00000000000E+0,0,; +|CR,1,49,1,1.000000024447218E-1,2.139131538569927E-8,1,1,s;|CS,1,34,1,ˆ D@ ƒ@,Ù•@H ¤@*Hh;