52 if (
char(_data[0]) !=
'#')
58 if (_data.size() == 1)
65 if (!std::isdigit(
char(_data[1])))
71 if (_data.size() == 2)
78 const auto digits = std::min(parseNumberOfSizeDigits(), _data.size() - 2);
79 for (std::size_t digit = 0; digit < digits; digit++)
81 if (!std::isdigit(_data[2 + digit]))
105 return _data.size() >= _blockSize_B;
120 auto end = begin +
size;
121 _data.insert(_data.end(), begin, end);
127 const auto read_bytes = std::min(bytesRemaining(),
size);
130 auto end = begin + read_bytes;
131 _data.insert(_data.end(), begin, end);
138 return _payloadSize_B;
149 return _data.data() + _headerSize_B;
153 std::size_t BlockData::parseNumberOfSizeDigits()
const
155 if (_data.size() < 2)
164 const std::string digit_str(begin, 1);
165 return std::stoul(digit_str);
169 std::size_t BlockData::parsePayloadSize_B()
const
171 const std::size_t digits = parseNumberOfSizeDigits();
177 if (_data.size() < 2 + digits)
186 std::string size_str(begin, digits);
187 return std::stoul(size_str);
191 void BlockData::processHeader()
206 const auto numberOfSizeDigits = parseNumberOfSizeDigits();
207 if (!numberOfSizeDigits)
214 const std::size_t payloadSize_B = parsePayloadSize_B();
223 _headerSize_B = 2 + numberOfSizeDigits;
224 _payloadSize_B = payloadSize_B;
225 _blockSize_B = _headerSize_B + _payloadSize_B;
226 _data.reserve(_blockSize_B);
230 std::size_t BlockData::bytesRemaining()
const
237 return _blockSize_B - _data.size();
rohdeschwarz::scpi::BlockData definition
bool isHeaderError() const
Checks the header for errors.
bool isComplete() const
Checks for complete Block Data header and payload.
BlockData()
Default Constructor.
std::size_t size() const
Gets payload size, in bytes, from a complete header.
unsigned char * data()
Gets a pointer to the payload data.
bool isHeader() const
Checks for a valid and complete Block Data header.
void push_back(std::vector< unsigned char >::const_iterator begin, std::size_t size)
Copies data to block.