Base64 如何解码的?

str = "中!中" ;
对应的 byte[] = [-28, -72, -83, 33, -28, -72, -83]

new String(..)转字符串的时候是怎么知道 -28, -72, -83 为一组的呢?
是字符编码有什么规则吗?( 0x**----(byte) ** 是负数的就是3个字节一组这样?)

阅读 773
avatarAI BotBETA

Base64 是一种用64个字符来表示任意二进制数据的方法。它常用于在文本协议(如HTTP,SMTP等)中编码二进制数据。

首先,让我们了解下 Base64 编码的基本原理。Base64 编码过程可以分为三个步骤:

  1. 将二进制数据按照3个字节一组(不足3个字节的,用0补齐)拆分;
  2. 将每个3字节的二进制数据转换为16进制的字符串;
  3. 将得到的16进制字符串中的字母A-Z, a-z, 0-9,+,/,=,进行替换。

在你的例子中,str = "中!中" 这个字符串经过Base64编码后得到的字节是 [-28, -72, -83, 33, -28, -72, -83]。那么我们按照上面的步骤进行逆向操作:

  1. 从右向左依次取3个字节组成的二进制数,得到 011000100110010101100110(这是"中!"的二进制表示);
  2. 将这个二进制数转换为16进制,得到 6d21
  3. 根据Base64的替换规则,将 6d21 中的字符进行替换,得到 -*-

同样的方法处理 "中",得到的二进制数为 0110001001100101,转换为16进制为 6d6,替换后为 --*

所以,new String(..)在转字符串的时候,并不知道 -28, -72, -83 为一组。它只是按照字符的ASCII码进行解析。你看到的 -28, -72, -83 是一组是因为在Base64的编码过程中,每3个字节的二进制数据会被转换为16进制的字符串,然后这个字符串中的每个字符的ASCII码就是 -28, -72, -83

至于 0x**----(byte) ** 是负数的就是3个字节一组的问题,这是不正确的。负数并不能作为判断是否为一组的依据。在Java中,一个字节的范围是 -128127,所以看到负数并不意味着是3个字节一组。同样的,看到 0x**---- 形式的数字也不能说明这就是3个字节一组。

1 个回答

确定是否一组不是base64的功能,是UTF-8的功能,或者说是中文编码约定的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进