str = "中!中" ;
对应的 byte[] = [-28, -72, -83, 33, -28, -72, -83]
new String(..)
转字符串的时候是怎么知道 -28, -72, -83
为一组的呢?
是字符编码有什么规则吗?( 0x**----
,(byte) **
是负数的就是3个字节一组这样?)
str = "中!中" ;
对应的 byte[] = [-28, -72, -83, 33, -28, -72, -83]
new String(..)
转字符串的时候是怎么知道 -28, -72, -83
为一组的呢?
是字符编码有什么规则吗?( 0x**----
,(byte) **
是负数的就是3个字节一组这样?)
Base64 是一种用64个字符来表示任意二进制数据的方法。它常用于在文本协议(如HTTP,SMTP等)中编码二进制数据。
首先,让我们了解下 Base64 编码的基本原理。Base64 编码过程可以分为三个步骤:
在你的例子中,str = "中!中"
这个字符串经过Base64编码后得到的字节是 [-28, -72, -83, 33, -28, -72, -83]
。那么我们按照上面的步骤进行逆向操作:
011000100110010101100110
(这是"中!"的二进制表示);6d21
;6d21
中的字符进行替换,得到 -*-
。同样的方法处理 "中"
,得到的二进制数为 0110001001100101
,转换为16进制为 6d6
,替换后为 --*
。
所以,new String(..)
在转字符串的时候,并不知道 -28, -72, -83
为一组。它只是按照字符的ASCII码进行解析。你看到的 -28, -72, -83
是一组是因为在Base64的编码过程中,每3个字节的二进制数据会被转换为16进制的字符串,然后这个字符串中的每个字符的ASCII码就是 -28, -72, -83
。
至于 0x**----
和 (byte) **
是负数的就是3个字节一组的问题,这是不正确的。负数并不能作为判断是否为一组的依据。在Java中,一个字节的范围是 -128
到 127
,所以看到负数并不意味着是3个字节一组。同样的,看到 0x**----
形式的数字也不能说明这就是3个字节一组。
确定是否一组不是base64的功能,是UTF-8的功能,或者说是中文编码约定的。