15 return Error::BufferTooSmall;
17 buf_[pos_++] =
static_cast<uint8_t
>(value);
18 }
else if (value <= 0xFFFF) {
20 return Error::BufferTooSmall;
23 buf_[pos_++] =
static_cast<uint8_t
>(value >> 8);
24 buf_[pos_++] =
static_cast<uint8_t
>(value);
25 }
else if (value <= 0xFFFFFFFF) {
27 return Error::BufferTooSmall;
30 buf_[pos_++] =
static_cast<uint8_t
>(value >> 24);
31 buf_[pos_++] =
static_cast<uint8_t
>(value >> 16);
32 buf_[pos_++] =
static_cast<uint8_t
>(value >> 8);
33 buf_[pos_++] =
static_cast<uint8_t
>(value);
36 return Error::BufferTooSmall;
39 buf_[pos_++] =
static_cast<uint8_t
>(value >> 56);
40 buf_[pos_++] =
static_cast<uint8_t
>(value >> 48);
41 buf_[pos_++] =
static_cast<uint8_t
>(value >> 40);
42 buf_[pos_++] =
static_cast<uint8_t
>(value >> 32);
43 buf_[pos_++] =
static_cast<uint8_t
>(value >> 24);
44 buf_[pos_++] =
static_cast<uint8_t
>(value >> 16);
45 buf_[pos_++] =
static_cast<uint8_t
>(value >> 8);
46 buf_[pos_++] =
static_cast<uint8_t
>(value);
48 return Error::Success;
54 return Error::BufferTooSmall;
56 buf_[pos_++] =
static_cast<uint8_t
>(value);
57 }
else if (value <= 0xFFFF) {
59 return Error::BufferTooSmall;
61 buf_[pos_++] =
static_cast<uint8_t
>(value >> 8);
62 buf_[pos_++] =
static_cast<uint8_t
>(value);
63 }
else if (value <= 0xFFFFFFFF) {
65 return Error::BufferTooSmall;
67 buf_[pos_++] =
static_cast<uint8_t
>(value >> 24);
68 buf_[pos_++] =
static_cast<uint8_t
>(value >> 16);
69 buf_[pos_++] =
static_cast<uint8_t
>(value >> 8);
70 buf_[pos_++] =
static_cast<uint8_t
>(value);
73 return Error::BufferTooSmall;
75 buf_[pos_++] =
static_cast<uint8_t
>(value >> 56);
76 buf_[pos_++] =
static_cast<uint8_t
>(value >> 48);
77 buf_[pos_++] =
static_cast<uint8_t
>(value >> 40);
78 buf_[pos_++] =
static_cast<uint8_t
>(value >> 32);
79 buf_[pos_++] =
static_cast<uint8_t
>(value >> 24);
80 buf_[pos_++] =
static_cast<uint8_t
>(value >> 16);
81 buf_[pos_++] =
static_cast<uint8_t
>(value >> 8);
82 buf_[pos_++] =
static_cast<uint8_t
>(value);
84 return Error::Success;
97 return Error::BufferTooSmall;
99 std::memcpy(buf_ + pos_, data, len);
101 return Error::Success;
106 if (err != Error::Success) {
111 if (err != Error::Success) {
117 if (err != Error::Success) {
122 return Error::Success;
129 if (err != Error::Success) {
134 if (err != Error::Success) {
149 return {.
value = 0, .error = Error::DecodeFailed};
152 const uint8_t firstByte = buf_[pos_++];
154 if (firstByte <= 252) {
155 return {.value = firstByte, .error = Error::Success};
156 }
else if (firstByte == 253) {
158 return {.value = 0, .error = Error::DecodeFailed};
161 (
static_cast<uint64_t
>(buf_[pos_]) << 8) |
static_cast<uint64_t
>(buf_[pos_ + 1]);
163 return {.value = val, .error = Error::Success};
164 }
else if (firstByte == 254) {
166 return {.value = 0, .error = Error::DecodeFailed};
168 const uint64_t val = (
static_cast<uint64_t
>(buf_[pos_]) << 24) |
169 (
static_cast<uint64_t
>(buf_[pos_ + 1]) << 16) |
170 (
static_cast<uint64_t
>(buf_[pos_ + 2]) << 8) |
171 static_cast<uint64_t
>(buf_[pos_ + 3]);
173 return {.value = val, .error = Error::Success};
176 return {.value = 0, .error = Error::DecodeFailed};
178 const uint64_t val = (
static_cast<uint64_t
>(buf_[pos_]) << 56) |
179 (
static_cast<uint64_t
>(buf_[pos_ + 1]) << 48) |
180 (
static_cast<uint64_t
>(buf_[pos_ + 2]) << 40) |
181 (
static_cast<uint64_t
>(buf_[pos_ + 3]) << 32) |
182 (
static_cast<uint64_t
>(buf_[pos_ + 4]) << 24) |
183 (
static_cast<uint64_t
>(buf_[pos_ + 5]) << 16) |
184 (
static_cast<uint64_t
>(buf_[pos_ + 6]) << 8) |
185 static_cast<uint64_t
>(buf_[pos_ + 7]);
187 return {.value = val, .error = Error::Success};
193 return {.
value = 0, .error = Error::DecodeFailed};
197 for (
size_t idx = 0; idx < numBytes; ++idx) {
198 val = (val << 8) | buf_[pos_++];
201 return {.value = val, .error = Error::Success};
207 return {.value = 0, .error = result.error};
210 if (result.value > 0xFFFFFFFF) {
211 return {.value = 0, .error = Error::DecodeFailed};
213 return {.value =
static_cast<uint32_t
>(result.value), .error = Error::Success};
219 return {.value = 0, .error = result.error};
221 return {.value =
static_cast<size_t>(result.value), .error = Error::Success};
226 if (!typeResult.ok()) {
227 return {.value = {.type = 0, .length = 0}, .error = typeResult.error};
231 if (!lengthResult.ok()) {
232 return {.value = {.type = 0, .length = 0}, .error = lengthResult.error};
235 return {.value = {.type = typeResult.value, .length = lengthResult.value},
236 .error = Error::Success};
241 return Error::DecodeFailed;
243 std::memcpy(out, buf_ + pos_, len);
245 return Error::Success;
250 return Error::DecodeFailed;
253 return Error::Success;
Result< uint32_t > readType()
Read a TLV Type.
Error readBytes(uint8_t *out, size_t len)
Read a specified number of bytes.
Result< size_t > readLength()
Read a TLV Length.
Result< uint64_t > readNonNegativeInteger(size_t numBytes)
Read a non-negative integer of specified byte count.
Result< TlvHeader > readTlvHeader()
Read a TLV header (Type and Length) at once.
TlvDecoder(const uint8_t *buf, size_t len)
Constructor.
Error skip(size_t len)
Skip a specified number of bytes.
size_t remaining() const
Remaining readable bytes.
Result< uint64_t > readVarNumber()
Read a value in VAR-NUMBER format.
Error writeVarNumber(uint64_t value)
Write a value in VAR-NUMBER format.
Error writeLength(size_t length)
Write a TLV Length.
TlvEncoder(uint8_t *buf, size_t capacity)
Constructor.
Error writeNonNegativeInteger(uint64_t value)
Write a non-negative integer (big-endian, minimum bytes)
Error writeTlv(uint32_t type, const uint8_t *value, size_t valueLen)
Write a complete TLV structure.
Error writeBytes(const uint8_t *data, size_t len)
Write a byte sequence.
size_t remaining() const
Remaining writable bytes.
Error writeTlvNonNegativeInteger(uint32_t type, uint64_t value)
Write a non-negative integer as a TLV.
Error writeType(uint32_t type)
Write a TLV Type.
NDN TLV (Type-Length-Value) encoding.
constexpr size_t nonNegativeIntegerSize(uint64_t value)
Calculate the encoded size of a non-negative integer (minimum bytes)