String、ASCII、Byte

Posted by Charlie on 2019-07-11

下面讨论的一些问题,共同的前提是String字符串中的内容是ASCII码表示范围内的符号。

什么是String?

字面意思:字符串。其实内部使用char数组存储

什么是ASCII码

ASCII是美国信息交换标准代码,是现在通用的单字节编码系统,使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符,全称是American Standard Code for Information Interchange。

ASCII用来制订计算机中每个符号对应的代码,这也叫做计算机的内码(code)。
1、ASCII码于1968年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。
2、ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。
3、每个ASCII码以1个字节(Byte)储存,从0到数字127代表不同的常用符号,例如大写A的ASCII码是65,小写a则是97。
4、由于ASCII字节的七个位,最高位并不使用,所以后来又将最高的一个位也编入这套内码中,成为八个位的延伸ASCII(ExtendedASCII)码,这套内码加上了许多外文和表格等特殊符号,成为目前常用的内码。

ASCII码对照表

什么是Byte

byte在java里面是一个字节

String、ASCII、Byte之间的关系

String.getBytes()方法返回的是一个byte数组,byte数组中的每一个值是十进制的ASCII码值。(前提为String字符串符号是ASCII码表示范围内的值)。

String.getBytes()返回什么

1
2
3
4
public static void main(String[] args) {
String s = "a";
System.out.println(Arrays.toString(s.getBytes()));
}

上面这段代码的返回值是:[97],97是字母a的ASCII十进制码值。

所以我们知道了,String.getBytes()返回的字节数组,其实是字符串中每个char的十进制ASCII码数组。

String.getBytes()源码分析(后续补上)

bytes[]转为Hex

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static String byteToHex(byte b[]) {
if (b == null) {
throw new IllegalArgumentException(
"Argument b ( byte array ) is null! ");
}
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0xff);
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}

上面这段代码的作用是,将一个byte数组转为一个Hex字符串。就是将十进制ASCII码转为16进制ASCII码。

String、byte[]、Hex转换时长度变化

String转为byte数组时,长度是不变化的。举例:“123abc” 长度为6,getBytes()后,byte数组的长度同样为6,因为String内部是使用char数组来存储的,一个char会转为其对应的ASCII码。

byte数组转为Hex字符串时,长度相比原String长度会加倍,因为一个byte转为ASCII码需要占用1个字节,而1个字节需要用2个16进制数字表示。举例:“a” 转为Hex为 "61"长度加倍。

相反,Hex转为byte[]和原String时,长度会减半。Hex(即16进制的ASCII码值)的两个数字表示一个ASCII码,即一个byte,一个byte也就是一个char,一个字符。