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"));
}
U64是u longlong 是llx 数据结构U8也不能左移那么多的一个bug
猜你喜欢
转载自blog.csdn.net/weixin_42381351/article/details/86567893
今日推荐
周排行