unit--为什么我自己造轮子!

完成0XAB--->'AB' 这样

我的结论是:

static void G_1byteTo2str(unsigned char* strings,unsigned char* bytes,unsigned char len)
{

    unsigned char const StrRefer[]="0123456789ABCDEF";
    #define GET_MSB_STR(x) (StrRefer[((x>>4)&0x0f)])
    #define GET_LSB_STR(x) (StrRefer[(x&0x0f)])
    for(char i=0,j=0;i<len;i++,j+=2)
    {
        strings[j]  =GET_MSB_STR(bytes[i]);
        strings[j+1]=GET_LSB_STR(bytes[i]);
    }

}
//自己增加了1个0在最后 string会变成后者的2倍+1
static unsigned char G_1byteTo2str(unsigned char* strings,unsigned char* bytes,unsigned char len)
{
#if 0 //自己造轮子
    unsigned char const StrRefer[]="0123456789ABCDEF";
    #define GET_MSB_STR(x) (StrRefer[((x>>4)&0x0f)])
    #define GET_LSB_STR(x) (StrRefer[(x&0x0f)])
    for(char i=0,j=0;i<len;i++,j+=2)
    {
        strings[j]  =GET_MSB_STR(bytes[i]);
        strings[j+1]=GET_LSB_STR(bytes[i]);
    }
	strings[j]='\0';//----------人工补充
    return 0;
#else //sprintf做经常的用法是0X1A-->"1A"这样 它就是printf 不过后者是去了控制台前者是到了自己约定的内存
	unsigned char i,length=0;
    for(unsigned char i=0;i<len;i++)
    length =sprintf((char*)&strings[2*i],"%02X",bytes[i]);
	printf("%d\n",length);//它是len的一半
    strings[2*i]='\0';//----------人工补充
	return 0;
#endif
}

为什么我放弃了尾巴添加0?------有的时候比较好 有的时候坚决不能!

为什么放弃了sprintf?---------因为它有副作用 它会在结尾加上结束符!

测试如下:

//+++++++++++案例不要!也就是+0也不一定好++++++++++
static void G_1byteTo2str(unsigned char* strings,unsigned char* bytes,unsigned char len)
{
  for(unsigned char i=0;i<len;i++)
    sprintf((char*)&strings[2*i],"%02X",bytes[i]);
}

int main(void)
{
  uint8_t backstr[8]={0};
  uint32_t weight=0XABCD1234;
  G_1byteTo2str(backstr,(uint8_t*)&weight,4);
  G_print(backstr,8,1);
  return 1;
}
//此时没有问题 因为正好我们收尾了



//说明1:uint8_t*不可以!它是const无法修改
//说明2:Write1250g[22]不可以!它必须有一个放置结束符
uint8_t Write1250g[23]   ={"FE0131000004E2CFFCCCFF"};
void ScaleCalib1250(uint8_t *inputweight)
{
  //uint8_t temc=Write1250g[14];
  G_print(Write1250g,22,1);
  G_1byteTo2str(&Write1250g[6],inputweight,4);
  //Write1250g[14]=temc;
  G_print(Write1250g,22,1);    
}
int main(void)
{
  uint32_t weight=0XABCD1234;
  ScaleCalib1250((uint8_t*)&weight);
  return 1;
}
//此时问题暴力! Write1250g[14]本来是c会被sprintf副作用修改为0 见鬼了!
可以用上面的temc来修复!但是 还有必要这么做吗?显然直接放弃该思路吧!

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/88800688