@@ -78,14 +78,14 @@ int exi_basetypes_convert_64_to_signed(exi_signed_t* exi_signed, int64_t value)
7878 return exi_basetypes_convert_64_to_unsigned(&exi_signed->data, value);
7979}
8080
81- int exi_basetypes_convert_from_unsigned(exi_unsigned_t* exi_unsigned, uint32_t* value, size_t max_octets)
81+ int exi_basetypes_convert_from_unsigned(const exi_unsigned_t* exi_unsigned, uint32_t* value, size_t max_octets)
8282{
8383 if (exi_unsigned->octets_count > max_octets)
8484 {
8585 return EXI_ERROR__OCTET_COUNT_LARGER_THAN_TYPE_SUPPORTS;
8686 }
8787
88- uint8_t* current_octet = exi_unsigned->octets;
88+ const uint8_t* current_octet = exi_unsigned->octets;
8989 *value = 0;
9090
9191 for (size_t n = 0; n < exi_unsigned->octets_count; n++)
@@ -98,14 +98,14 @@ int exi_basetypes_convert_from_unsigned(exi_unsigned_t* exi_unsigned, uint32_t*
9898 return EXI_ERROR__NO_ERROR;
9999}
100100
101- int exi_basetypes_convert_64_from_unsigned(exi_unsigned_t* exi_unsigned, uint64_t* value)
101+ int exi_basetypes_convert_64_from_unsigned(const exi_unsigned_t* exi_unsigned, uint64_t* value)
102102{
103103 if (exi_unsigned->octets_count > EXI_BASETYPES_UINT64_MAX_OCTETS)
104104 {
105105 return EXI_ERROR__OCTET_COUNT_LARGER_THAN_TYPE_SUPPORTS;
106106 }
107107
108- uint8_t* current_octet = exi_unsigned->octets;
108+ const uint8_t* current_octet = exi_unsigned->octets;
109109 *value = 0;
110110
111111 for (size_t n = 0; n < exi_unsigned->octets_count; n++)
@@ -118,19 +118,79 @@ int exi_basetypes_convert_64_from_unsigned(exi_unsigned_t* exi_unsigned, uint64_
118118 return EXI_ERROR__NO_ERROR;
119119}
120120
121- int exi_basetypes_convert_from_signed(exi_signed_t* exi_signed, int32_t* value, size_t max_octets)
121+ int exi_basetypes_convert_from_signed(const exi_signed_t* exi_signed, int32_t* value, size_t max_octets)
122122{
123123 uint32_t uValue = 0;
124124 int res = exi_basetypes_convert_from_unsigned(&exi_signed->data, &uValue, max_octets);
125125 *value = (exi_signed->is_negative == 0) ? uValue : -uValue;
126126 return res;
127127}
128128
129- int exi_basetypes_convert_64_from_signed(exi_signed_t* exi_signed, int64_t* value)
129+ int exi_basetypes_convert_64_from_signed(const exi_signed_t* exi_signed, int64_t* value)
130130{
131131 uint64_t uValue = 0;
132132 int res = exi_basetypes_convert_64_from_unsigned(&exi_signed->data, &uValue);
133133 *value = (exi_signed->is_negative == 0) ? uValue : -uValue;
134134 return res;
135135}
136+
137+ int exi_basetypes_convert_bytes_from_unsigned(const exi_unsigned_t* exi_unsigned, uint8_t* data, size_t* data_len, size_t data_size)
138+ {
139+ const uint8_t* current_octet = exi_unsigned->octets;
140+ uint16_t temp = 0;
141+ *data_len = 0;
142+ size_t total_offset = 0;
143+
144+ for (size_t n = 0; n < exi_unsigned->octets_count; n++) {
145+ temp = temp + ((uint16_t)(*current_octet & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK) << (total_offset));
146+ total_offset += 7;
147+ if (total_offset >= 8) {
148+ if (data_size == *data_len) {
149+ return -1;
150+ }
151+ total_offset -= 8;
152+ data[(*data_len)++] = temp & 0xFF;
153+ temp >>= 8;
154+ }
155+ current_octet++;
156+ }
157+ if (total_offset != 0) {
158+ if (data_size == *data_len) {
159+ return -1;
160+ }
161+ data[(*data_len)++] = temp & 0xFF;
162+ }
163+ return 0;
164+ }
165+
166+ int exi_basetypes_convert_bytes_to_unsigned(exi_unsigned_t* exi_unsigned, const uint8_t* data, size_t data_len)
167+ {
168+ uint8_t *current_octet = &exi_unsigned->octets[0];
169+ uint16_t dummy = 0;
170+ uint8_t dummy_count = 0;
171+
172+ for (size_t n = 0; n != data_len; n++, current_octet++) {
173+ if (dummy_count <= 8) {
174+ dummy = dummy | ((data[n]) << dummy_count);
175+ dummy_count += 8;
176+ }
177+ exi_unsigned->octets_count++;
178+ *current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK);
179+
180+ dummy = dummy >> 7u;
181+ dummy_count -= 7;
182+ if (n == data_len) {
183+ break;
184+ }
185+
186+ *current_octet |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK;
187+ }
188+ if (dummy_count > 0) {
189+ *(current_octet-1) |= EXI_BASETYPES_OCTET_SEQ_FLAG_MASK;
190+ exi_unsigned->octets_count++;
191+ *current_octet = (uint8_t)(dummy & EXI_BASETYPES_OCTET_SEQ_VALUE_MASK);
192+ }
193+ return 0;
194+ }
195+
136196{% endblock %}
0 commit comments