94 lines
2.0 KiB
C
94 lines
2.0 KiB
C
#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;
|
||
}
|