ByteReader.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #include "ByteReader.h"
  2. #include <string.h>
  3. /* generic LITTLE ENDIAN implementation */
  4. void bytereader_init(bytereader_t byte_reader, const void *data, size_t byte_length)
  5. {
  6. byte_reader->data = data;
  7. byte_reader->byte_length = byte_length;
  8. byte_reader->data_ptr = (const uint8_t *)data;
  9. }
  10. void bytereader_advance(bytereader_t byte_reader, size_t bytes)
  11. {
  12. byte_reader->byte_length -= bytes;
  13. byte_reader->data_ptr += bytes;
  14. }
  15. void bytereader_reset(bytereader_t byte_reader)
  16. {
  17. size_t diff = byte_reader->data_ptr - (const uint8_t *)byte_reader->data;
  18. byte_reader->byte_length += diff;
  19. byte_reader->data_ptr = (const uint8_t *)byte_reader->data;
  20. }
  21. size_t bytereader_find_zero(bytereader_t byte_reader)
  22. {
  23. size_t i=0;
  24. for (i=0;i<byte_reader->byte_length && byte_reader->data_ptr[i];i++)
  25. {
  26. // empty loop
  27. }
  28. return i;
  29. }
  30. /* n byte functions */
  31. void bytereader_show_n(bytereader_t byte_reader, void *destination, size_t bytes)
  32. {
  33. memcpy(destination, byte_reader->data_ptr, bytes);
  34. }
  35. void bytereader_read_n(bytereader_t byte_reader, void *destination, size_t bytes)
  36. {
  37. memcpy(destination, byte_reader->data_ptr, bytes);
  38. bytereader_advance(byte_reader, bytes);
  39. }
  40. /* 1 byte functions */
  41. uint8_t bytereader_show_u8(bytereader_t byte_reader)
  42. {
  43. return byte_reader->data_ptr[0];
  44. }
  45. uint8_t bytereader_read_u8(bytereader_t byte_reader)
  46. {
  47. uint8_t ret = byte_reader->data_ptr[0];
  48. bytereader_advance(byte_reader, 1);
  49. return ret;
  50. }
  51. int8_t bytereader_show_s8(bytereader_t byte_reader)
  52. {
  53. return *(const int8_t *)(byte_reader->data_ptr);
  54. }
  55. int8_t bytereader_read_s8(bytereader_t byte_reader)
  56. {
  57. int8_t ret = *(const int8_t *)(byte_reader->data_ptr);
  58. bytereader_advance(byte_reader, 1);
  59. return ret;
  60. }
  61. /* 2 byte little-endian functions */
  62. uint16_t bytereader_show_u16_le(bytereader_t byte_reader)
  63. {
  64. return (uint16_t)byte_reader->data_ptr[0] | ((uint16_t)byte_reader->data_ptr[1] << 8);
  65. }
  66. uint16_t bytereader_read_u16_le(bytereader_t byte_reader)
  67. {
  68. uint16_t ret = bytereader_show_u16_le(byte_reader);
  69. bytereader_advance(byte_reader, 2);
  70. return ret;
  71. }
  72. int16_t bytereader_show_s16_le(bytereader_t byte_reader)
  73. {
  74. return (int16_t)byte_reader->data_ptr[0] | ((int16_t)byte_reader->data_ptr[1] << 8);
  75. }
  76. int16_t bytereader_read_s16_le(bytereader_t byte_reader)
  77. {
  78. int16_t ret = bytereader_show_s16_le(byte_reader);
  79. bytereader_advance(byte_reader, 2);
  80. return ret;
  81. }
  82. /* 2 byte big-endian functions */
  83. uint16_t bytereader_show_u16_be(bytereader_t byte_reader)
  84. {
  85. return (uint16_t)byte_reader->data_ptr[1] | ((uint16_t)byte_reader->data_ptr[0] << 8);
  86. }
  87. uint16_t bytereader_read_u16_be(bytereader_t byte_reader)
  88. {
  89. uint16_t ret = bytereader_show_u16_be(byte_reader);
  90. bytereader_advance(byte_reader, 2);
  91. return ret;
  92. }
  93. int16_t bytereader_show_s16_be(bytereader_t byte_reader)
  94. {
  95. return (int16_t)byte_reader->data_ptr[1] | ((int16_t)byte_reader->data_ptr[0] << 8);
  96. }
  97. int16_t bytereader_read_s16_be(bytereader_t byte_reader)
  98. {
  99. int16_t ret = bytereader_show_s16_be(byte_reader);
  100. bytereader_advance(byte_reader, 2);
  101. return ret;
  102. }
  103. /* 4 byte functions */
  104. uint32_t bytereader_show_u32_be(bytereader_t byte_reader)
  105. {
  106. uint32_t x;
  107. // big endian extract
  108. x = byte_reader->data_ptr[0];
  109. x <<= 8;
  110. x |= byte_reader->data_ptr[1];
  111. x <<= 8;
  112. x |= byte_reader->data_ptr[2];
  113. x <<= 8;
  114. x |= byte_reader->data_ptr[3];
  115. return x;
  116. }
  117. uint32_t bytereader_read_u32_be(bytereader_t byte_reader)
  118. {
  119. uint32_t ret = bytereader_show_u32_be(byte_reader);
  120. bytereader_advance(byte_reader, 4);
  121. return ret;
  122. }
  123. /* 4 byte little-endian functions */
  124. uint32_t bytereader_show_u32_le(bytereader_t byte_reader)
  125. {
  126. uint32_t x;
  127. // little endian extract
  128. x = byte_reader->data_ptr[3];
  129. x <<= 8;
  130. x |= byte_reader->data_ptr[2];
  131. x <<= 8;
  132. x |= byte_reader->data_ptr[1];
  133. x <<= 8;
  134. x |= byte_reader->data_ptr[0];
  135. return x;
  136. }
  137. uint32_t bytereader_read_u32_le(bytereader_t byte_reader)
  138. {
  139. uint32_t ret = bytereader_show_u32_le(byte_reader);
  140. bytereader_advance(byte_reader, 4);
  141. return ret;
  142. }
  143. /* float functions */
  144. float bytereader_show_f32_be(bytereader_t byte_reader)
  145. {
  146. uint32_t ret = bytereader_show_u32_be(byte_reader);
  147. return *(float *)(&ret);
  148. }
  149. float bytereader_read_f32_be(bytereader_t byte_reader)
  150. {
  151. uint32_t ret = bytereader_read_u32_be(byte_reader);
  152. return *(float *)(&ret);
  153. }
  154. GUID bytereader_read_uuid_be(bytereader_t byte_reader)
  155. {
  156. GUID guid_value;
  157. guid_value.Data1 = bytereader_read_u32_be(byte_reader);
  158. guid_value.Data2 = bytereader_read_u16_be(byte_reader);
  159. guid_value.Data3 = bytereader_read_u16_be(byte_reader);
  160. bytereader_read_n(byte_reader, guid_value.Data4, 8);
  161. return guid_value;
  162. }
  163. GUID bytereader_read_uuid_le(bytereader_t byte_reader)
  164. {
  165. GUID guid_value;
  166. guid_value.Data1 = bytereader_read_u32_le(byte_reader);
  167. guid_value.Data2 = bytereader_read_u16_le(byte_reader);
  168. guid_value.Data3 = bytereader_read_u16_le(byte_reader);
  169. bytereader_read_n(byte_reader, guid_value.Data4, 8);
  170. return guid_value;
  171. }