2024-03-21
原文作者:小小工匠 原文地址: https://artisan.blog.csdn.net/article/details/136468496

202403212042322631.png


概述

Byte(字节)是计算机中数据存储的基本单位,通常用于衡量存储容量,比如移动硬盘的容量可以是1TB。

一个字节由8个比特(bit)组成。比特是最小的数据单位,它可以是0或1,用于表示二进制信息。

数据传输时通常以比特为单位进行计量,比如家里的宽带速度可能是以兆比特(Mbps)或千兆比特(Gbps)为单位。当我们说家里的宽带是100Mbps时,意味着每秒可以传输100兆比特的数据。

要将比特转换为字节,可以使用以下关系:1字节 = 8比特。因此,如果要将100Mbps转换为字节,需要将其除以8。

比特(Bit):

  • 比特是信息的最小单位,代表一个二进制数字,可以是0或1。
  • 它是数字数据存储和传输的基础,所有的信息都是由比特组成的。
  • 比特通常用于描述计算机中的单个开关或存储单元的状态。

字节(Byte):

  • 字节是由8个比特组成的集合,通常表示为8位二进制数,即2^8 = 256个可能的组合。
  • 字节是计算机中最常用的数据单位,用于表示文本字符、数字和其他数据。
  • 一个字节可以存储一个ASCII字符,其中ASCII(美国标准信息交换码)是一种将英文字符、数字和其他符号编码为二进制数的标准。

在实际应用中,比特和字节的关系可以这样理解:字节是比特的集合,而比特是构成字节的单个砖块。计算机处理数据时,通常以字节为单位进行读写和传输,但底层的数据传输和存储则是由单个比特组成的。


Code

获取字符串byte

      public static void main(String[] args) {
            String a = "a";
            byte[] bytes = a.getBytes();
            for (byte b : bytes) {
                // 打印发现byte实际上就是ascii码
                System.out.println(b);
            }
        }

byte转化为bit

    public class ByteBit {
        public static void main(String[] args) {
            // 定义一个字符串变量a
            String a = "a";
            // 将字符串a转换为字节数组
            byte[] bytes = a.getBytes();
            // 遍历字节数组中的每个字节
            for (byte aByte : bytes) {
                // 将字节转换为整数值
                int c = aByte;
                // 打印出整数值
                System.out.println(c);
                // 将整数值转换为二进制字符串表示
                String s = Integer.toBinaryString(c);
                // 打印出二进制字符串表示
                System.out.println(s);
            }
        }
    }

将字符串"a"转换为字节数组,并将每个字节对应的整数值和二进制表示打印出来

202403212042332192.png

1100001 打印出来应该是8个bit,但前面是0,没有打印 ,从打印结果可以看出来,一个英文字符 ,占一个字节


中文对应的字节(UTF-8编码)–> 一个中文对应的是三个字节

这段代码演示了根据不同的编码格式(UTF-8和GBK)将字符串转换为字节数组,并打印出每个字节的整数值和二进制表示。

    /**
     * 根据编码的格式不一样,对应的字节也不一样
     * 
     * 如果是UTF-8:一个中文对应的是三个字节
     * 如果是GBK : 一个中文对应的是二个字节
     * <p>
     * 如果是英文,就无所谓编码格式
     */
    public static void main(String[] args) throws Exception {
        // 定义一个字符串变量a,包含一个中文字符
        String a = "小";
        // 根据UTF-8编码格式将字符串转换为字节数组
        //byte[] bytes = a.getBytes();
        
        // 根据GBK编码格式将字符串转换为字节数组
        //byte[] bytes = a.getBytes("GBK");
        
        // 根据UTF-8编码格式将字符串转换为字节数组
        byte[] bytes = a.getBytes("UTF-8");
    
        // 遍历字节数组中的每个字节
        for (byte aByte : bytes) {
            // 打印出每个字节的整数值
            System.out.println(aByte);
            // 将每个字节的整数值转换为二进制字符串表示,并打印出来
            String s = Integer.toBinaryString(aByte);
            System.out.println(s);
        }
    }

202403212042335173.png

根据不同的编码格式,一个中文字符所占的字节数也不同,UTF-8编码下一个中文字符通常占三个字节,而GBK编码下通常占两个字节。


中文对应的字节(GBK编码)–> 一个中文对应的是两个字节

    byte[] bytes = a.getBytes("GBK");

202403212042338724.png


英文对应的字节 - 跟编码无关

      public static void main(String[] args) throws Exception {
            String a = "a";
            byte[] bytes = a.getBytes();
            for (byte aByte : bytes) {
                System.out.println(aByte);
                String s = Integer.toBinaryString(aByte);
                System.out.println(s);
            }
        }

202403212042343035.png

小结

根据编码格式的不同,字符所占的字节数也不同,这是因为不同的编码方式使用不同的规则来表示字符。这里提到了两种常见的字符编码格式:UTF-8和GBK。

  • UTF-8 :UTF-8是一种变长字符编码,通常用来表示Unicode字符集中的字符。在UTF-8编码下,一个中文字符通常由三个字节表示,而一个英文字符则由一个字节表示。因为UTF-8采用了变长编码,所以不同的字符可能占据不同数量的字节,从而能够灵活地表示各种语言的字符。
  • GBK :GBK是一种针对汉字的多字节编码,它主要用于中文字符的表示。在GBK编码下,一个中文字符通常由两个字节表示,而一个英文字符则仍然由一个字节表示。与UTF-8不同,GBK编码是固定长度的,每个字符所占的字节数都是相同的。

对于英文字符,由于其在各种编码格式下都是用相同的规则表示,因此无论使用何种编码格式,英文字符都只占一个字节。

202403212042346446.png

阅读全文