大家好,欢迎来到IT知识分享网。
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' //网诺过来“23450” 需要理解成0X23450 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' //网诺过来“23450” 需要理解成0X23450 //这个函数有问题 最后找到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; }*/ //优化 就是最上面的我的函数 //网诺过来“23450” 需要理解成0X23450 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 *)"23")); }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120510.html