U64是u longlong 是llx 数据结构U8也不能左移那么多的一个bug

atol64数据结构的错误 16个char标识一个U64

#include<stdio.h>
#include <string.h>
typedef unsigned char  uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int   uint32_t;
typedef unsigned long  long uint64_t;//注意:单片机的U64是long long 打印是llX 不是long -lX

//无视
static unsigned char str_to_int(unsigned char dData)
{
    if(dData <= '9')
          return dData-'0';
    else if((dData >= 'A')&&(dData <= 'F'))
          return dData+10-'A';
    else
      return dData+10-'a';
}
//我的工具
//"1234"  4  -->0X12 0X34
int string_to_hex( char *data , int length ,unsigned char *respone)
{

    if(length%2 != 0)   return -1;

    for( int i = 0 ; i < length/2 ;i++)
    {
        *respone++ = (((str_to_int(data[i*2])<<4)&0xf0)|(str_to_int(data[i*2+1])&0x0f)); 
    }

    return 0;
    
}
//OK-------------
/*
//U64形如:0XFFFFFFFFFFFFFFFF 需要8个0XFF 16个'F' 
//网诺过来“1234512345123450” 需要理解成0X1234512345123450
uint64_t atol64( char *str)
{
    uint64_t t[16]={0}; 
    uint8_t i=0 , cnt =0 , j =0;
    uint64_t temp = 0;
     printf("%d \n",strlen(str) ); 
     for(i=0;i<16;i++) 
        t[i]=str_to_int(str[i]);//隐含准话U8--U64
    
    for( i = 0 ; i < 16; i++)
    {
        printf("%02X ",t[i] );
        temp |= t[i]<<((15-i)*4);
        printf("%16llX\n",temp );
    }
    
    return temp;
    
}
//bug
*/
/*
//U64形如:0XFFFFFFFFFFFFFFFF 需要8个0XFF 16个'F' 
//网诺过来“1234512345123450” 需要理解成0X1234512345123450
//这个函数有问题 最后找到bug是数据结构t[8]不能是u8 它左移的位数不能比8大!比如写u64 t[8]但是这样必须重新string_to_hex没啥优势了
uint64_t atol64( char *str)
{
    uint8_t t[8]={0}; 
    uint8_t i=0 , cnt =0 , j =0;
    uint64_t temp = 0;
      
    string_to_hex(str,16,t);
    
    for( i = 0 ; i < 8; i++)
    {
        printf("%02X ",t[i] );
        temp |= t[i]<<((7-i)*8);
        printf("%llX\n",temp );
    }
    
    return temp;
}

*/
//OK
/*
uint64_t atol64( char *str)
{
    uint64_t t[16]={0}; 
    uint8_t i=0 , cnt =0 , j =0;
    uint64_t temp = 0;
    
    while( *str != '\0')
    {
        t[cnt++] = str_to_int(*str);
        str++;
        if( cnt > 16)
            return 0;
    }
    
    j = cnt -1;
    
    for( i = 0 ; i < cnt ; i++)
    {
        printf("%02X ",t[j] );
        temp |= t[j--]<<(i*4);
        printf("%16llX \n",temp);
    }
    
    return temp;
    
}*/
//优化 就是最上面的我的函数
//网诺过来“1234512345123450” 需要理解成0X1234512345123450
uint64_t atol64( char *str)
{
    uint64_t t[16]={0}; 
    uint8_t i=0 ;
    uint64_t temp = 0;
    uint8_t len=strlen(str);
    if(len>16) return -1;
     for(i=0;i<len;i++) 
     {
        t[i]=str_to_int(str[i]);//隐含准话U8--U64
        temp |= t[i]<<((len-1-i)*4);
     }
    
    return temp;
    
}
int main()
{

    printf("\n%llx",  atol64((char *)"1234512345123"));
}

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/86567893
u