记录下自己的C程序demo

一、自己写的

1. HEX转DEC

输入:字符数组,数组长度
输出:32位整形有符号数
用例:
    char x[4];
    x[0] = 'E';
    x[1] = 'F';
    x[2] = 'F';
    x[3] = 'F';
代码:
	int32_t Hex2Int32(char* x , int8_t lenth){
		int32_t y =0;
		int8_t t= 1; //符号位
		for(int i = lenth - 1 ; i >= 0 ;i--)       
		{
	
	       if(x[i]>='0' && x[i]<='9'){
	            y=y*16+x[i]-'0';
	       }          
	       else if(x[i]>='a' && x[i]<='f'){
	            y=y*16+x[i]+10-'a';
	       }          
	       else if(x[i]>='A' && x[i]<='F'){
	           
	            y=y*16+x[i]+10-'A';
	       }  
	        if( i == lenth - 1 && y >= 8){ //符号位
	            t = -1;
	            y -= 8; //最高位是符号,不算值
	       }
		}
		return t < 0 ? y - 32768 : y; 
	}

2. motorola编码

输入:startBit,bitLength,编码对应变量,编码byte数组
输出:void Motorola_Code( uint8_t startBit , uint8_t bitLength , uint32_t val , uint8_t* buf){
    int row, col ;
    
    row = startBit / 8;
	col = startBit % 8;
    

    for(int i = 0 ; i < bitLength ; i ++){
        buf[row] |= ( val & 0x01u ) << col;
        
        val = val>> 1;
        col++;
        if(col > 7){
            col = 0;
            row--;
        }
    }
}

3.motorola解码(有待验证)

void Motorola_DeCode( uint8_t startBit , uint8_t bitLength , uint32_t val , uint8_t* buf){
    int row, col ,bit;
    
    row = startBit / 8;
	col = startBit % 8;
    

    for(int i = 0 ; i < bitLength ; i ++){
        bit = (buf[row] & (0x01u << col));
        val |= (bit << i);        
        
        col++;
        if(col > 7){
            col = 0;
            row--;
        }
    }
}

二、收集的

1. 字节数组按位取32位数

/* extract unsigned/signed bits ------------------------------------------------
* extract unsigned/signed bits from byte data
* args   : uint8_t *buff    I   byte data
*          int    pos    I      bit position from start of data (bits)
*          int    len    I      bit length (bits) (len<=32)
* return : extracted unsigned/signed bits
*-----------------------------------------------------------------------------*/

uint32_t getbitu(const uint8_t* buff, int pos, int len)
{
    uint32_t bits = 0;
    int i;
    for(i = pos; i < pos + len; i++) bits = (bits << 1) + ((buff[i / 8] >> (7 - i % 8)) & 1u);
    return bits;
}

int32_t getbits(const uint8_t* buff, int pos, int len)
{
    uint32_t bits = getbitu(buff, pos, len);
    if(len <= 0 || 32 <= len || !(bits & (1u << (len - 1)))) return (int32_t)bits;
    return (int32_t)(bits | (~0u << len)); /* extend sign */

2. 32位数按位放入字节数组

extern void setbitu(uint8_t* buff, int pos, int len, uint32_t data)
{
    uint32_t mask = 1u << (len - 1);
    int i;
    if(len <= 0 || 32 < len) return;
    for(i = pos; i < pos + len; i++, mask >>= 1)
    {
        if(data & mask) buff[i / 8] |= 1u << (7 - i % 8);
        else buff[i / 8] &= ~(1u << (7 - i % 8));
    }
}
extern void setbits(uint8_t* buff, int pos, int len, int32_t data)
{
    if(data < 0) data |= 1 << (len - 1);
    else data &= ~(1 << (len - 1)); /* set sign bit */
    setbitu(buff, pos, len, (uint32_t)data);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值