编写了一个底层读取设备ID 并与到已有的库里面查询这个ID是否存在的测试代码。遇到了一些问题,在次进行分析一下,我的环境是ubuntu和android ndk,测试这段代码,两个有所不同:直接上代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//十六进制转换为字符,位转换
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下运行的结果是成功的的,如下图:
打印信息可以看到结果没问题的,也可以正常运行,这是当把这段代码在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';
可是我依然无法解释这个问题,只好在此记录仪下了