BG2312 ascii hex 字符数组 字符串 总结

背景知识

嵌入式开发有时候经常会解析传感器的数据,这里进行一下总结:
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码。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值