C语言常用函数、校验函数

注意函数返回值类型
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;
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值