18 std::size_t out_cap, std::size_t* off)
noexcept {
19 if (out ==
nullptr || off ==
nullptr) {
22 if (*off >= out_cap) {
26 if (value_len <= 0x7FU) {
27 if (*off >= out_cap) {
30 out[(*off)++] =
static_cast<std::uint8_t
>(value_len);
33 if (value_len <= 0xFFU) {
34 if (*off + 1U >= out_cap) {
37 out[(*off)++] = 0x81U;
38 out[(*off)++] =
static_cast<std::uint8_t
>(value_len);
41 if (value_len <= 0xFFFFU) {
42 if (*off + 2U >= out_cap) {
45 out[(*off)++] = 0x82U;
46 out[(*off)++] =
static_cast<std::uint8_t
>((value_len >> 8U) & 0xFFU);
47 out[(*off)++] =
static_cast<std::uint8_t
>(value_len & 0xFFU);
53[[nodiscard]]
inline Error Append(std::uint8_t tag,
const std::uint8_t* value, std::size_t value_len,
54 std::uint8_t* out, std::size_t out_cap, std::size_t* off)
noexcept {
59 if (*off + value_len > out_cap) {
62 if (value_len > 0U && value !=
nullptr) {
63 std::memcpy(out + *off, value, value_len);
69[[nodiscard]]
inline Error AppendU8(std::uint8_t tag, std::uint8_t value, std::uint8_t* out, std::size_t out_cap,
70 std::size_t* off)
noexcept {
71 return Append(tag, &value, 1U, out, out_cap, off);
74[[nodiscard]]
inline Error AppendU16Be(std::uint8_t tag, std::uint16_t value, std::uint8_t* out,
75 std::size_t out_cap, std::size_t* off)
noexcept {
76 const std::uint8_t bytes[2] = {
static_cast<std::uint8_t
>((value >> 8U) & 0xFFU),
77 static_cast<std::uint8_t
>(value & 0xFFU)};
78 return Append(tag, bytes,
sizeof(bytes), out, out_cap, off);
81[[nodiscard]]
inline bool DecodeLength(
const std::uint8_t* data, std::size_t data_len, std::size_t* off,
82 std::size_t* value_len)
noexcept {
83 if (data ==
nullptr || off ==
nullptr || value_len ==
nullptr || *off >= data_len) {
86 const std::uint8_t l0 = data[(*off)++];
87 if ((l0 & 0x80U) == 0U) {
91 const std::size_t num_bytes =
static_cast<std::size_t
>(l0 & 0x7FU);
92 if (num_bytes == 0U || num_bytes > 2U || *off + num_bytes > data_len) {
96 for (std::size_t i = 0; i < num_bytes; ++i) {
97 len = (len << 8U) | data[(*off)++];
103[[nodiscard]]
inline bool FindFirst(std::uint8_t wanted_tag,
const std::uint8_t* tlv_data, std::size_t tlv_len,
104 const std::uint8_t** value_out, std::size_t* value_len_out)
noexcept {
105 if (tlv_data ==
nullptr || value_out ==
nullptr || value_len_out ==
nullptr) {
109 while (off < tlv_len) {
110 const std::uint8_t tag = tlv_data[off++];
111 std::size_t value_len = 0;
112 if (!
DecodeLength(tlv_data, tlv_len, &off, &value_len)) {
115 if (off + value_len > tlv_len) {
118 if (tag == wanted_tag) {
119 *value_out = tlv_data + off;
120 *value_len_out = value_len;
Definition se050_tlv.hpp:15
bool DecodeLength(const std::uint8_t *data, std::size_t data_len, std::size_t *off, std::size_t *value_len) noexcept
Definition se050_tlv.hpp:81
Error Append(std::uint8_t tag, const std::uint8_t *value, std::size_t value_len, std::uint8_t *out, std::size_t out_cap, std::size_t *off) noexcept
Definition se050_tlv.hpp:53
Error AppendU16Be(std::uint8_t tag, std::uint16_t value, std::uint8_t *out, std::size_t out_cap, std::size_t *off) noexcept
Definition se050_tlv.hpp:74
Error AppendU8(std::uint8_t tag, std::uint8_t value, std::uint8_t *out, std::size_t out_cap, std::size_t *off) noexcept
Definition se050_tlv.hpp:69
Error AppendTagAndLength(std::uint8_t tag, std::size_t value_len, std::uint8_t *out, std::size_t out_cap, std::size_t *off) noexcept
Definition se050_tlv.hpp:17
bool FindFirst(std::uint8_t wanted_tag, const std::uint8_t *tlv_data, std::size_t tlv_len, const std::uint8_t **value_out, std::size_t *value_len_out) noexcept
Definition se050_tlv.hpp:103
Error
Definition se050_types.hpp:14
Shared types, limits, and error codes for the HF-SE050 driver.