注意函数返回值类型
1、大小端的切换
#define SWAP_ENDIAN_U16(x) ((((x)&0xFF00) >> 8)|(((x)&0x00FF) << 8))
#define SWAP_ENDIAN_U32(x) ((((x)&0xFF000000) >> 24)|(((x)&0x00FF0000) >> 8)|(((x)&0x0000FF00) << 8)|(((x)&0x000000FF) << 24))
2、十六进制与BCD码切换
(u16)
#define HEX2BCD(hex) ((((hex)/10)<<4)|((hex)%10))
#define BCD2HEX(bcd) (((bcd)>>4)*10+((bcd)&0x0F))
(u32)
static u32 DecToBCD(u32 num)
{
u32 res_num = 0;//结果
u32 rem_num = 0;//余数
rem_num = num % 10;
while((num/10) != 0)
{
num = num/10;
res_num = num * 16;
}
res_num = res_num + rem_num;
return res_num;
}
3、十六进制字符串转十六进制
("32"转换为0x32)
bits4_num = 8 为u32
bits4_num = 4 为u16
bits4_num = 2为u8
static u32 hex_str_to_u32(u8 bits4_num,u8* pstr)
{
//bits4_num 为 4个bit的数量
u32 val, offset;
for(val = 0, offset = 0; offset < bits4_num; offset++)
{
if(('0' <= pstr[offset]) && (pstr[offset] <= '9'))
{
val = (val << 4);
val |= (pstr[offset] - '0');
}
else if(('a' <= pstr[offset]) && (pstr[offset] <= 'f'))
{
val = (val << 4);
val |= (pstr[offset] - 'a' + 0x0A);
}
else if(('A' <= pstr[offset]) && (pstr[offset] <= 'F'))
{
val = (val << 4);
val |= (pstr[offset] - 'A' + 0x0A);
}
else
{
val = 0;
break;
}
}
return val;
}
4、十六进制转为ASCII
(0x32 转换为 '3' '2',注意ASCII数组长度要为十六进制数组的2倍)
一个u16的十六进制会转换出两个ASCII字符
static void hex_to_ascii_str(u8* phex_data, u8 hex_type_len, u8* pascii_hex_str)
{
/* NOTE: ascii_buf len must >= 2 * hex_buf_len */
u8 temp, val, k;
if((NULL == phex_data) || (NULL == pascii_hex_str)) return;
for(k = 0; k < hex_type_len; k++)
{
val = phex_data[k];
temp = (val >> 4) & 0x0F;
if(temp <= 0x09) *pascii_hex_str = '0' + temp;
else *pascii_hex_str = 'A' + (temp - 0x0A);
pascii_hex_str++;
temp = (val & 0x0F);
if(temp <= 0x09) *pascii_hex_str = '0' + temp;
else *pascii_hex_str = 'A' + (temp - 0x0A);
pascii_hex_str++;
}
}
5、校验和
static u16 CHK_CUSUM(u8* pdata, u16 len)
{
u16 sum = 0, k;
if((NULL == pdata) ||(0 == len)) return 0;
for(k = 0; k < len; k++)
{
sum += pdata[k];
}
return sum;
}
6、异或校验
static u8 CHK_XOR(u8* pdata, u16 len)
{
u16 crc = 0, k;
if((NULL == pdata) ||(0 == len)) return 0;
for(crc = pdata[0], k = 1; k < len; k++)
{
crc ^= pdata[k];
}
return (u8)(crc);
}
7、CRC16_CCITT_FALSE
static u16 CRC16_CCITT_FALSE(u8* dataBuf, u16 len)
{
u16 i, n;
u16 accum = 0xffff;
u8 *p = dataBuf;
for (n = 0; n < len; n++)
{
accum ^= ((u16)(*p) | 0x0000) << 8;
for(i = 0; i < 8; i++)
{
if(( accum & 0x8000) == 0x8000)
{
accum = (accum << 1) ^ 0x1021;
}
else
{
accum <<= 1;
}
}
p++;
}
return accum;
}