C++ Utilities 5.26.1
Useful C++ classes and routines such as argument parser, IO and conversion utilities
Loading...
Searching...
No Matches
binaryreader.cpp
Go to the documentation of this file.
1#include "./binaryreader.h"
2
4
5#include <cstring>
6#include <memory>
7#include <sstream>
8
9using namespace std;
10
11namespace CppUtilities {
12
31void 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{
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
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
75void 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
96string 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
111std::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
129string 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
151std::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
168std::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
182const 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
static std::uint32_t computeCrc32(const char *buffer, std::size_t length)
Reads length bytes from the buffer and computes the CRC-32 for that block of data.
std::string readTerminatedString(std::uint8_t termination=0)
Reads a terminated string from the current stream.
std::string readString(std::size_t length)
Reads a string from the current stream of the given length from the stream and advances the current p...
static const std::uint32_t crc32Table[]
CRC-32 table.
void setStream(std::istream *stream, bool giveOwnership=false)
Assigns the stream the reader will read from when calling one of the read-methods.
const std::istream * stream() const
Returns a pointer to the stream the reader will read from when calling one of the read-methods.
std::istream::pos_type readRemainingBytes()
Returns the number of remaining bytes in the stream from the current offset.
std::uint32_t readCrc32(std::size_t length)
Reads length bytes from the stream and computes the CRC-32 for that block of data.
void giveOwnership()
The reader will take ownership over the assigned stream.
std::istream::pos_type readStreamsize()
Returns the size of the assigned stream.
Contains all utilities provides by the c++utilities library.
STL namespace.
constexpr int i