-#ifdef __BIG_ENDIAN__
- uint8_t bytes[8] = {0};
- bool status = pb_read(stream, bytes, field->data_size);
- uint8_t bebytes[8] = {bytes[7], bytes[6], bytes[5], bytes[4],
- bytes[3], bytes[2], bytes[1], bytes[0]};
- endian_copy(dest, lebytes, field->data_size, 8);
- return status;
-#else
- return pb_read(stream, (uint8_t*)dest, field->data_size);
-#endif
+ uint64_t value;
+ if (!pb_decode_varint(stream, &value))
+ return false;
+
+ switch (field->data_size)
+ {
+ case 1: *(uint8_t*)dest = (uint8_t)value; break;
+ case 2: *(uint16_t*)dest = (uint16_t)value; break;
+ case 4: *(uint32_t*)dest = (uint32_t)value; break;
+ case 8: *(uint64_t*)dest = value; break;
+ default: PB_RETURN_ERROR(stream, "invalid data_size");
+ }
+
+ return true;
+}
+
+bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest)
+{
+ int64_t value;
+ if (!pb_decode_svarint(stream, &value))
+ return false;
+
+ switch (field->data_size)
+ {
+ case 4: *(int32_t*)dest = (int32_t)value; break;
+ case 8: *(int64_t*)dest = value; break;
+ default: PB_RETURN_ERROR(stream, "invalid data_size");
+ }
+
+ return true;
+}
+
+bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest)
+{
+ UNUSED(field);
+ return pb_decode_fixed32(stream, dest);
+}
+
+bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest)
+{
+ UNUSED(field);
+ return pb_decode_fixed64(stream, dest);