#include "jt808_util.h" #include "jt808_config.h" // 双字节大小端转换 uint16_t Swap16(uint16_t val16){ return (((val16 & 0x00FF) << 8) | ((val16 & 0xFF00) >> 8)); } // 四字节大小端转换 uint32_t Swap32(uint32_t val32){ return (((val32 & 0x000000FF) << 24) | ((val32 & 0x0000FF00) << 8) | ((val32 & 0x00FF0000) >> 8) | ((val32 & 0xFF000000) >> 24)); } // 异或校验 uint8_t BCC_Check(const uint8_t *src, uint32_t len) { uint8_t bcc_check = 0; for(uint32_t i = 0; i < len; ++i){ bcc_check ^= src[i]; } return bcc_check; } // 十进制转BCD码 uint8_t DecToBcd(uint8_t Dec){ uint8_t temp; temp = ((Dec / 10) << 4) + (Dec % 10); return temp; } // BCD码转十进制 uint8_t BcdToDec(uint8_t Bcd){ uint8_t temp; temp = (Bcd >> 4) * 10 + (Bcd & 0x0f); return temp; } // 原始字符串转BCD码 //奇数位时,首位BCD码前面补0 uint8_t *rawStrToBcd(uint8_t *bcd, const uint8_t *str, uint16_t str_len){ uint8_t *ptr = bcd; uint8_t temp; if (str_len % 2 != 0){ *ptr++ = DecToBcd(*str++ - '0'); } while (*str){ temp = *str++ - '0'; temp *= 10; temp += *str++ - '0'; *ptr++ = DecToBcd(temp); } return bcd; } // BCD转字符串,自动去掉bcd码前导零 // bcdlen 为bcd码字节数 uint8_t *BcdToStr(uint8_t *str, const uint8_t *bcd, int bcd_len){ uint8_t *ptr = str; uint8_t temp; int cnt = bcd_len; while (cnt--){ temp = BcdToDec(*bcd); *ptr++ = temp / 10 + '0'; if(str[0] == '0'){ ptr = str; } *ptr++ = temp % 10 + '0'; if(str[0] == '0'){ ptr = str; } ++bcd; } return str; } // 原始BCD数据转字符串 // strlen 为原始BCD数据字节数 uint8_t *rawBcdToStr(uint8_t *str, const uint8_t *bcd, int bcd_len){ uint8_t *ptr = str; uint8_t temp; int cnt = bcd_len; while (cnt--) { temp = BcdToDec(*bcd); *ptr++ = temp / 10 + '0'; *ptr++ = temp % 10 + '0'; ++bcd; } return str; }