C语言16进制转字符串,并从文件中查询到这个16进制字符串问题解析

编写了一个底层读取设备ID 并与到已有的库里面查询这个ID是否存在的测试代码。遇到了一些问题,在次进行分析一下,我的环境是ubuntu和android ndk,测试这段代码,两个有所不同:直接上代码:

#include     
#include 
#include 
//十六进制转换为字符,位转换
unsigned char HexToChar(unsigned char temp)
{
    unsigned char dst;
    if (temp < 10){
        dst = temp + '0';//数字小于10,就用‘0’字符加
    }else{
        dst = temp -10 +'a';//大于=10,就使用a或者A转换,即大小写
    }
    return dst;
}

int main(){
    int vid=0x2188;//设备VID
    int pid=0x0ae1;//设备VID
    int data = (vid << 16) +pid;//将设备VID和PID进行合并,就是四位16进制变成8位0x21880ae1
    unsigned char str[8];//用于存贮每一位16进制的数字
    char dst[8];//用于存贮每一位16进制的数字转换后的字符
    int i =0;
    int key = 0;//有无查找到的标志为
 //文件定义
    FILE * fp;
    int end =0;
    char * fileName = "/bhw/bhwusblist";//打开本地的库文件
    for(i=0;i<8;i++)
	{
	str[i] = (data >> (7-i)*4) & 0xf;//获取8位16进制的每一位数字	
	}
    
    for(i = 0; i<8;i++)
    {
        dst[i] = HexToChar(str[i]);//16进制转换为字符串
    }
    printf("%s\n",dst);	

//读取文件并在文件中搜索要查找的字符串

    if((fp = fopen(fileName, "rb")) == 0) {//打开库文件
        printf("Can't open %s, program will to exit.", fileName);
        exit(1);
    }
    fseek(fp, 0L, SEEK_END);// 移动到文件尾部
    end = ftell(fp);//获取文件大小
    char * all = (char *)calloc(end, sizeof(char));
    fseek(fp, 0L, SEEK_SET);// 移动到文件头部
    fgets(all, end, fp);//读取整个文件的内容到内存
    char *s = strstr(all, dst);//查找设备
    printf("all =%s\n",all);
    if(s==NULL) {printf("sssss \n"); key = 0;}//没有查找到
    else {printf("okkkkk\n"); key = 1;}//找到
    free(all);
        return 0;
}

在ubuntu下运行的结果是成功的的,如下图:

C语言16进制转字符串,并从文件中查询到这个16进制字符串问题解析_第1张图片

打印信息可以看到结果没问题的,也可以正常运行,这是当把这段代码在Android NDK 下编译后放到Android下运行的时候 就出问题了,问题是在16进制转换为字符串的时候出了问题,我的定义是 char ds[8]t;得到的应该是 “21880ae1”,但是得到的结果却是:“21880ae1@*d”,在已有的8位后面多了几个乱码,这样无论怎么样查找都不会成功,后来把定义改成char * dst;指针的方式可是依然由乱码,后来我定义了一个字符串然后打印,定义为char * dst1 = “adcdef12”;然后我同时打印:

__android_log_print(6,"usb-device-manager"," dst=%s dst1=%s %d---201800829",dst,dst1, strlen(dst));

这个打印就更奇怪了,如下

 dst=21880ae1@*d dst1=adcdef1221880ae1@*d 13---201800829

两个字符串居然都被dst1打出来了,依然由乱码,最后没办法解释这种现象,只好在字符串后面加结束符'\0':

dst[8]='\0';

可是我依然无法解释这个问题,只好在此记录仪下了

你可能感兴趣的:(unix编程杂谈)