java通过字节数组查看真实内容

前言

当我们打开debug模式时,经常能看到变量里有这么一坨。

看着一脸懵逼,我们知道这是byte数组,java在通信时,都会将内容转换为二进制流来传输,二进制流在debug模式里最直观的体现就是byte数组。最小单位就是byte。

今天我们不通过程序去转换内容,而是通过计算器去算出真实的内容,主要目的还是理解存储的意义。

实验

字符串

定义一个字符串变量a="123",然后通过getBytes方法转换为字节数组。代码如下:

 转换后的字节输入如下:

可以看到字节数组长度为3,每个字符占用1byte。 

通过查看Unicode编码10进制可以知道,49代表1,50代表2,51代表3,

可以看出字符串的编码规则很简单,再看看字符串汉字,

转换后的字节如下:

可以看到每个汉字占用了3个字节,这个关系其实使用的是utf-8编码方式,具体编码规则参考这篇文章:https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

比如前3个字节,-27、-68、-96。用计算器分别计算这三个数的二进制对应关系如下:

 再将这3个二进制按照顺序排列,对应十进制值为:

15056032

 通过在线编码转换如下:

可以看到,最后计算出的结果和在线转换的是一样的。

整数

定义一个整型变量a=123,然后将a转化为byte数组

这里要说明一下,我们知道int是占用4个字节,所以转换为byte数组后会生成一个长度为4的数组。

这里要说明,截图中bytes为大端模式转换, 何为大端模式

大端模式与小端模式

  1. 大端模式是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中.
  2. 小端模式是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中

具体细节参考文章:https://blog.csdn.net/jason_cuijiahui/article/details/79010257

java传输数据默认都采用大端模式

上边的123只需要1byte即可存储,我们换个大点的数

可以看到 跟123的效果不一样了。

我们先用计算机看下100110,对应的二进制是多少

 如上图,数据的低中高位已标出。

然后看下低位对应的10进制是多少。

可以看出,为14,再对比bytes数组截图

正好在内存的高地址中。与预期一致。顺带贴出转换方法代码:

    public static byte[] toHH(int n) {
        byte[] b = new byte[4];
        b[3] = (byte) (n & 0xff);
        b[2] = (byte) (n >> 8 & 0xff);
        b[1] = (byte) (n >> 16 & 0xff);
        b[0] = (byte) (n >> 24 & 0xff);
        return b;
    }

 总结

我们知道java有8大基本数据类型:byte(字节型)、short(短整型)、int (整型) 、long(长整型)、float(单精度浮点型)、double(双精度浮点型)、boolean(布尔型)、char(字符型)

他们分别占用的空间是,8位,16位,32位,64位,32位,64位,8位,16位。来张图更直观一点。

在传输数据过程中,占用1字节的无所谓,占用1个字节以上的数据类型存在大端、小端模式,需要与前端统一好。

这些知识,主要在做tcp传输,涉及byte或者bit层级协议时,会特别有用,可以关注一下。 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值