C++ Utilities  5.0.1
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 
52 istream::pos_type BinaryReader::readStreamsize()
53 {
54  istream::pos_type cp = m_stream->tellg();
55  m_stream->seekg(0, ios_base::end);
56  const auto streamsize = m_stream->tellg();
57  m_stream->seekg(cp);
58  return streamsize;
59 }
60 
61 void BinaryReader::bufferVariableLengthInteger()
62 {
63  static constexpr int maxPrefixLength = 8;
64  int prefixLength = 1;
65  const auto beg = static_cast<std::uint8_t>(m_stream->peek());
66  std::uint8_t mask = 0x80;
67  while (prefixLength <= maxPrefixLength && (beg & mask) == 0) {
68  ++prefixLength;
69  mask >>= 1;
70  }
71  if (prefixLength > maxPrefixLength) {
72  throw ConversionException("Length denotation of variable length unsigned integer exceeds maximum.");
73  }
74  memset(m_buffer, 0, maxPrefixLength);
75  m_stream->read(m_buffer + (maxPrefixLength - prefixLength), prefixLength);
76  *(m_buffer + (maxPrefixLength - prefixLength)) ^= mask;
77 }
78 
82 string BinaryReader::readString(size_t length)
83 {
84  string res;
85  res.resize(length);
86  m_stream->read(&res[0], static_cast<streamsize>(length));
87  return res;
88 }
89 
97 std::string BinaryReader::readTerminatedString(std::uint8_t termination)
98 {
99  stringstream ss(ios_base::in | ios_base::out | ios_base::binary);
100  ss.exceptions(ios_base::badbit | ios_base::failbit);
101  m_stream->get(*ss.rdbuf(), static_cast<char>(termination)); // delim byte is not extracted from the stream
102  m_stream->seekg(1, ios_base::cur); // "extract" delim byte manually
103  return ss.str();
104 }
105 
115 string BinaryReader::readTerminatedString(std::size_t maxBytesToRead, std::uint8_t termination)
116 {
117  string res;
118  res.reserve(maxBytesToRead);
119  while (res.size() < maxBytesToRead) {
120  const auto c = static_cast<char>(m_stream->get());
121  if (static_cast<std::uint8_t>(c) == termination) {
122  return res;
123  }
124  res += c;
125  }
126  return res;
127 }
128 
137 std::uint32_t BinaryReader::readCrc32(size_t length)
138 {
139  std::uint32_t crc = 0x00;
140  for (std::uint32_t i = 0; i < length; ++i) {
141  crc = (crc << 8) ^ crc32Table[((crc >> 24) & 0xff) ^ static_cast<std::uint8_t>(m_stream->get())];
142  }
143  return crc;
144 }
145 
154 std::uint32_t BinaryReader::computeCrc32(const char *buffer, size_t length)
155 {
156  std::uint32_t crc = 0x00;
157  for (const char *i = buffer, *end = buffer + length; i != end; ++i) {
158  crc = (crc << 8) ^ crc32Table[((crc >> 24) & 0xff) ^ static_cast<std::uint8_t>(*i)];
159  }
160  return crc;
161 }
162 
168 const std::uint32_t BinaryReader::crc32Table[] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
169  0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
170  0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
171  0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
172  0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
173  0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
174  0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
175  0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
176  0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
177  0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
178  0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
179  0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
180  0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
181  0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
182  0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
183  0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
184  0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
185  0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
186  0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
187  0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
188  0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
189  0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 };
190 
191 } // namespace CppUtilities
binaryreader.h
CppUtilities
Contains all utilities provides by the c++utilities library.
Definition: argumentparser.h:17
i
constexpr int i
Definition: traitstests.cpp:103