DataHelper.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "DataHelper.hpp"
  2. void DataHelper::check_sum(uint8_t buf[], const int start, const int len, uint8_t checksum[])
  3. {
  4. // 所得结果模65536余数取反加1
  5. int sum = 0;
  6. for (int i = start; i < start + len; i++) {
  7. sum += buf[i];
  8. }
  9. int ts = (~(sum % 65536) + 1);
  10. checksum[0] = static_cast<uint8_t>(ts >> 8);
  11. checksum[1] = static_cast<uint8_t>(ts & 0xFF);
  12. }
  13. int DataHelper::get_len(uint8_t buf[])
  14. {
  15. // uint8_t dest[4];
  16. // buffer_from_ascii_uint8(dest, buf, 4);
  17. // 计算长度
  18. int len1 = buf[0] & 0x0F << 8;
  19. int len2 = buf[1];
  20. const int len = len1 + len2;
  21. // 校验长度 校验码的计算:D11D10D9D8+D7D6D5D4+D3D2D1D0,求和后模16余数取反加1。
  22. uint8_t b1 = (buf[0] & 0x0F);
  23. uint8_t b2 = (buf[1] & 0xF0) >> 4;
  24. uint8_t b3 = (buf[1] & 0x0F);
  25. const int t = b1 + b2 + b3;
  26. uint8_t check = (~(t % 16) + 1) & 0x0F;
  27. uint8_t check1 = (buf[0] & 0xF0) >> 4;
  28. if (check!= check1) {
  29. return -1;
  30. }
  31. return len;
  32. }
  33. void DataHelper::generate_len(const int len, uint8_t after_len[])
  34. {
  35. const uint8_t hi = static_cast<uint8_t>(len >> 8);
  36. const uint8_t lo = static_cast<uint8_t>(len & 0xFF);
  37. const int t = hi & 0x0F + (lo & 0xF0 >> 4) + lo & 0x0F;
  38. const uint8_t check = static_cast<uint8_t>(~(t % 16) + 1);
  39. after_len[0] = hi + (check << 4);
  40. after_len[1] = lo;
  41. }
  42. int DataHelper::get_unsigned_int(uint8_t buf[], int len)
  43. {
  44. // 高位在前,低位在后,支持多个字节,用for循环实现
  45. int val = 0;
  46. for (int i = 0; i < len; i++) {
  47. val += buf[i] << (8 * (len-i-1));
  48. }
  49. return val;
  50. }
  51. int DataHelper::get_signed_int(uint8_t buf[], int len)
  52. {
  53. // 高位在前,低位在后,支持多个字节,用for循环实现
  54. int val = 0;
  55. for (int i = 0; i < len; i++) {
  56. uint8_t b = buf[i];
  57. if(i == 0) {
  58. b = b & 0x7F;
  59. }
  60. val += b << (8 * (len-i-1));
  61. }
  62. return buf[0] >> 7 == 0 ? val: -val;
  63. }
  64. double DataHelper::get_unsigned_double(uint8_t buf[], const int len, const int factor)
  65. {
  66. const int val = get_unsigned_int(buf, len);
  67. return val / (factor * 1.0);
  68. }
  69. double DataHelper::get_signed_double(uint8_t buf[], const int len, const int factor)
  70. {
  71. const int val = get_signed_int(buf, len);
  72. return val / (factor * 1.0);
  73. }
  74. void DataHelper::buffer_copy_uint8_ascii(uint8_t* dest, uint8_t b, uint8_t& index)
  75. {
  76. char hexString[3];
  77. int len = snprintf(hexString, 3, "%02X", b);
  78. if (len > 0) {
  79. dest[index++] = hexString[0];
  80. dest[index++] = hexString[1];
  81. }
  82. }
  83. void DataHelper::buffer_copy_uint16_ascii(uint8_t* dest, uint16_t b, uint8_t& index)
  84. {
  85. char hexString[5];
  86. int len = snprintf(hexString, 5,"%04X", b);
  87. if (len > 0) {
  88. dest[index++] = hexString[0];
  89. dest[index++] = hexString[1];
  90. dest[index++] = hexString[2];
  91. dest[index++] = hexString[3];
  92. }
  93. }
  94. int DataHelper::buffer_from_ascii_uint8(uint8_t* dest, uint8_t* src, int len)
  95. {
  96. const int byteLen = len/2;
  97. for (int i = 0; i < byteLen; i++) {
  98. char hex[3];
  99. hex[0] = src[i*2];
  100. hex[1] = src[i*2+1];
  101. hex[2] = '\0';
  102. int byteValue = 0;
  103. sscanf_s(hex, "%x", &byteValue);
  104. dest[i] = byteValue;
  105. }
  106. return byteLen;
  107. }
  108. uint8_t DataHelper::read_uint8_ascii(uint8_t* src, uint8_t& index)
  109. {
  110. uint8_t data[1];
  111. buffer_from_ascii_uint8(data, src+ index, 2);
  112. index += 2;
  113. return data[0];
  114. }
  115. uint16_t DataHelper::read_uint16_ascii(uint8_t* src, uint8_t& index)
  116. {
  117. uint8_t data[2];
  118. buffer_from_ascii_uint8(data , src + index, 4);
  119. index += 4;
  120. return (data[0] << 8) + data[1];
  121. }