java如何将中文转换成byte数组

作为一名程序员,有时候会在想,java是如何将一个中文字符,转化成一个byte数组,是如果从一个byte数组转化成字符的呢? 其实大家都知道utf-8英文占1个字节,中文占3个字节,GBK中文英文都占2个字节,但是我想问,比如utf-8,有谁知道一个中文字符是如何在java中转换成一个byte数组的?

好了,下面进入我们的正题:

例如;中 这个字是如何转换成一个byte数组的?

String str = "中";
byte [] bs = str.getBytes("UTF-8");

首先,任意一个字符都定义在统一的unicode编码表中,unicode有65535个字符,几乎包含了所有的语言。所以‘中’在unicode中的编码为\u4E2D对应10进制为20013.
然后看下utf-8计算byte数组的算法:
var4[0] = (byte)(224 | var8 >> 12);
var4[1] = (byte)(128 | var8 >> 6 & 63);
var4[2] = (byte)(128 | var8 & 63);

第0个数组 20013>> 12 结果再和224进行或运算
20013二进制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
向右移动12位: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
224的二进制: 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
| 运算结果为: 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0
11100100的十进制为: -28

第1个数组 20013>> 6 结果再和63与运算 再和128或运算
20013二进制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
向右移动12位: 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0
63的二进制: 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
& 运算结果为: 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0
128的二进制为: 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
| 运算结果为: 10111000
十进制为: -72

第2个数组 20013& 63 再和128或运算
20013二进制: 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1
63的二进制: 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
& 运算结果为: 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1
128的二进制为: 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
| 运算结果为: 10101101
十进制为: -83

这样3个byte数组的数字分别是 -28 -72 -83 ,大家可以通过java运行来检验下结果是否正确, 其实第0位数组算的是16位字节中的前4位,第1位数组放的5-10位字节,第2位数组放的是11-16位的字节,既 4+6+6 = 16 byte数组按照这种方式切分。
那么下面问大家一个问题:
第0位数组为什么要和224或运算?
第1位数组为什么要和128或运算?
第2位数组为什么要和128或运算?
有知道答案的大家可以在下方留言

  • 1
    点赞
  • 9
    收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 4

打赏作者

dezun

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值