最近一周因为M5升级的事情搞的太累,脑子基本都是涨的。
总结一些最近遇到的小知识点,希望可以更好的理解。
C++中,
1、数字0,字符0,\0的区别
理解这三者的区别,首先需要知道什么是ascii码。
百度百科对ascii的定义可以概括为: 一套电脑编码系统、现今最通用的单字节编码系统
就是电脑可以识别的一套编码,码值在全球范围内通用。
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
反斜杠\0: 对应ascii码 (按十六进制输出)0X00
表示字符串的结束,字符串末尾默认添加,字符串在按%s格式输出时遇到\0自动停止;
数字0:对应ascii码0X00
经常用在初始化变量的时候
CHAR a[10] = {0};//全部初始化为数字0
需要注意的是:按%s输出时在遇到数字0的时候也会停止输出,因为它和\0的ascii码相同。
字符0 :‘0’对应ascii码0X30
CHAR a[10] = “0000000000”; //字符数组全部初始化为字符0
为了验证猜想是否正确,专门在代码运行的时候,输出这三个的十六进制ascii码值:
LOGI(“===’0’= %x”, ‘0’);
LOGI(“===222 = %x”, ‘\0’);
LOGI(“===0 = %x”, 0);
I/ATVMW@customerdata( 1620): ===’0’= 30
I/ATVMW@customerdata( 1620): ===222 = 0
I/ATVMW@customerdata( 1620): ===0 = 0
使用场景:
产线做eeprom母片的时候,eeprom里面需要bin,全部写的是十六进制,这些十六进制代码根据场景需要翻译成对应的识别方式。
比如barcode十六进制段转换成ascii码字符串用于屏幕显示、屛参标志位的十六进制转换成十进制来判断对应的是哪个屏等等。
一般意义上的字符串准确的说应该叫做ascii码字符串,当然也有其它方式编码的字符串。字符串有它自己的编码方式,如果脱离了编码方式,谈字符串意义不大。
java中
String的isEmpty判断字符串是否为空?
其实isEmpty完全等同于string.length()==0 ,string.length()实际上就是字符串的字节长度,计算的是遇到\0就停止的长度,长度不包括\0。
如果String本身是null,那么使用string.isEmpty()会报空指针异常(NullPointerException)
判断一个String为空的最安全的方法,还是 string ==null || string.isEmpty()
理解:string == null 实际上是这个string在内存中没有存在,没有申请内存空间,经常出现在变量定义了没有初始化,如果操作此string会出现非法访问或空指针等报错。
string.isEmpty()如果为true时,表示我string已经初始化过或者已经在内存中有申请空间,但是我的长度为0,
比如test = “”;(这个字符串里面是\0开头的)满足此判断。
举例:
public static void main(String[] args) {
// TODO Auto-generated method stub
String test = “”;
if(test == null) {
System.out.print(“i am null”);
}
if(test.isEmpty()) {
System.out.print(“i am length is 0”);
}
String a = “123”;
System.out.print(a.length());
}
打印:
i am length is 0
3