C++ Utilities  5.10.5
Useful C++ classes and routines such as argument parser, IO and conversion utilities
binaryreader.cpp
Go to the documentation of this file.
1 #include "./binaryreader.h"
2 
3 #include "../conversion/conversionexception.h"
4 
5 #include <cstring>
6 #include <memory>
7 #include <sstream>
8 
9 using namespace std;
10 
11 namespace CppUtilities {
12 
31 void BinaryReader::setStream(istream *stream, bool giveOwnership)
32 {
33  if (m_ownership) {
34  delete m_stream;
35  }
36  if (stream) {
37  m_stream = stream;
38  m_ownership = giveOwnership;
39  } else {
40  m_stream = nullptr;
41  m_ownership = false;
42  }
43 }
44 
51 istream::pos_type BinaryReader::readStreamsize()
52 {
53  istream::pos_type cp = m_stream->tellg();
54  m_stream->seekg(0, ios_base::end);
55  const auto streamsize = m_stream->tellg();
56  m_stream->seekg(cp);
57  return streamsize;
58 }
59 
66 istream::pos_type BinaryReader::readRemainingBytes()
67 {
68  istream::pos_type cp = m_stream->tellg();
69  m_stream->seekg(0, ios_base::end);
70  const auto streamsize = m_stream->tellg();
71  m_stream->seekg(cp);
72  return streamsize - cp;
73 }
74 
75 void BinaryReader::bufferVariableLengthInteger()
76 {
77  static constexpr int maxPrefixLength = 8;
78  int prefixLength = 1;
79  const auto beg = static_cast<std::uint8_t>(m_stream->peek());
80  std::uint8_t mask = 0x80;
81  while (prefixLength <= maxPrefixLength && (beg & mask) == 0) {
82  ++prefixLength;
83  mask >>= 1;
84  }
85  if (prefixLength > maxPrefixLength) {
86  throw ConversionException("Length denotation of variable length unsigned integer exceeds maximum.");
87  }
88  memset(m_buffer, 0, maxPrefixLength);
89  m_stream->read(m_buffer + (maxPrefixLength - prefixLength), prefixLength);
90  *(m_buffer + (maxPrefixLength - prefixLength)) ^= static_cast<char>(mask);
91 }
92 
96 string BinaryReader::readString(size_t length)
97 {
98  string res;
99  res.resize(length);
100  m_stream->read(&res[0], static_cast<streamsize>(length));
101  return res;
102 }
103 
111 std::string BinaryReader::readTerminatedString(std::uint8_t termination)
112 {
113  stringstream ss(ios_base::in | ios_base::out | ios_base::binary);
114  ss.exceptions(ios_base::badbit | ios_base::failbit);
115  m_stream->get(*ss.rdbuf(), static_cast<char>(termination)); // delim byte is not extracted from the stream
116  m_stream->seekg(1, ios_base::cur); // "extract" delim byte manually
117  return ss.str();
118 }
119 
129 string BinaryReader::readTerminatedString(std::size_t maxBytesToRead, std::uint8_t termination)
130 {
131  string res;
132  res.reserve(maxBytesToRead);
133  while (res.size() < maxBytesToRead) {
134  const auto c = static_cast<char>(m_stream->get());
135  if (static_cast<std::uint8_t>(c) == termination) {
136  return res;
137  }
138  res += c;
139  }
140  return res;
141 }
142 
151 std::uint32_t BinaryReader::readCrc32(size_t length)
152 {
153  std::uint32_t crc = 0x00;
154  for (std::uint32_t i = 0; i < length; ++i) {
155  crc = (crc << 8) ^ crc32Table[((crc >> 24) & 0xff) ^ static_cast<std::uint8_t>(m_stream->get())];
156  }
157  return crc;
158 }
159 
168 std::uint32_t BinaryReader::computeCrc32(const char *buffer, size_t length)
169 {
170  std::uint32_t crc = 0x00;
171  for (const char *i = buffer, *end = buffer + length; i != end; ++i) {
172  crc = (crc << 8) ^ crc32Table[((crc >> 24) & 0xff) ^ static_cast<std::uint8_t>(*i)];
173  }
174  return crc;
175 }
176 
182 const std::uint32_t BinaryReader::crc32Table[] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
183  0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
184  0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
185  0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
186  0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
187  0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
188  0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
189  0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
190  0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
191  0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
192  0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
193  0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
194  0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
195  0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
196  0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
197  0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
198  0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
199  0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
200  0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
201  0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
202  0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
203  0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 };
204 
205 } // namespace CppUtilities
Contains all utilities provides by the c++utilities library.
constexpr int i