背景知识
嵌入式开发有时候经常会解析传感器的数据,这里进行一下总结:
GB2312是汉字的编码,每个汉字的hex,有两个8位的16进制数组成。
参考:http://www.knowsky.com/resource/gb2312tbl.htm
英文字符使用ascii进行编码
参考:https://baike.baidu.com/item/ASCII/309296?fr=aladdin
字符数组初始化:
char p1[] = "a";
char p3[] = {'a', '\0'};
char p2[] = {'a'};
printf("p1:%s, siezof(p1):%d\n", p1, sizeof(p1));
printf("p3:%s, siezof(p3):%d\n", p3, sizeof(p3));
printf("p2:%s, siezof(p2):%d\n", p2, sizeof(p2));
运行结果:
由此可见,字符串默认是带有\0的,因此使用字符串数组初始化的时候,需要多加一个字节的空间。
使用单个字符进行初始化的时候,需要自己手动加上\0,否则答应的时候会有问题。
字符串数组,字符串既可以是中文也可以是英文。使用的编码默认就是gb2312和ascii码。
在使用的某些时候,uint8_t,int8_t本质上和unsigned char ,char是没有什么区别的。
char x = 0x41;
char y[] = {0xbb, 0xf0, 0};
char z[] = "火";
printf("x:%c\n", x);
printf("y:%s, sizeof(y):%d\n", y, sizeof(y));
printf("z:%s, sizeof(z):%d\n", z, sizeof(z));
运行结果:
总结就是,计算机只有16进制进行表示,具体是中文字符,还是英文字符,还是16进制的数,只是解析打印的方式不一样。我们处理起来确实一样的。
继续看下面的例子。
首先了解一些字符串处理函数:
char *strstr(char *str1, const char *str2);
* strstr(str1,str2)
str1: 被查找目标 string expression to search.
str2: 要查找对象 The string expression to find.
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
代码实例:
char a[10] = {1, 2, 3, 0xbb, 0xf0, 0, 6, 7, 8};
char b[2] = {48, 49};
for (int i = 0; i< 10 ;i ++) {
printf("%d", a[i]);
}
printf("**********\n");
char *p = (char*)"火";
printf("%s\n", strstr(a, p));
运行结果:
由上面可以看出,原始的数据是没有“火”这个中文字符的,但是我使用函数strstr进行查找的时候,是可以从这个数据中找到这个中文字符的,得到对应的地址之后,打印出来刚好也是这个中文字符。
再看一下电脑是小段模式,则以下结果为多少:
char c[] = "1234";
printf("c:%s\n", c);
printf("*(int*)c:%x\n", *(int*)c);
printf("atoi(c):%d\n", atoi(c));
电脑是小段模式第二项打印出来的是asscii码。