精华内容
下载资源
问答
  • Byte字节 bit的区别java中字节容量关系一个英文字母对应多少个字节一个中文字对应多少个字节总结 java中字节容量关系 1TB=1024GB TB是千千兆 1GB=1024MB GB是千兆 1MB=1024KB MB是兆 1KB=1024Byte KB是千字节 ...

    java中字节容量关系

    1TB=1024GB      TB是千千兆 
    1GB=1024MB      GB是千兆 
    1MB=1024KB      MB是兆  
    1KB=1024Byte    KB是千字节 
    
    注意:Byte的缩写是B也就是字节
    

    在实际开发中,不可避免的要跟字符串和Byte字节打交道,很多时候当你debug的时候会发现一串的数字:{97,104,…}
    其中有正数也有负数,这个到底是什么,今天重新学习一下

    一个英文字母对应多少个字节

    public class ByteBit {
        public static void main(String[] args) {
            String a = "a";
            byte[] bytes = a.getBytes();
            for (byte b : bytes) {
                int c = b;
                // 打印发现byte实际上就是ascii码
                System.out.println(c);      // 97
                // 我们来看看每个byte对应的bit,byte获取对应的Bit
                String s = Integer.toBinaryString(c);
                // 1100001 打印出来的结果应该是8个bit,那是前面有个0,没有打印出来,
                // 从打印结果可以看到,一个英文字符,占一个字节
                System.out.println(s);
            }
        }
    

    执行结果为:

    97
    1100001
    
    public class ByteBit {
        public static void main(String[] args) {
            String a = "alrewre";
            byte[] bytes = a.getBytes();
            for (byte b : bytes) {
                int c = b;
                // 打印发现byte实际上就是ascii码
                System.out.println(c);
                // 我们来看看每个byte对应的bit,byte获取对应的Bit
                String s = Integer.toBinaryString(c);
                System.out.println(s);
            }
        }
    

    执行结果为:

    97
    1100001
    108
    1101100
    114
    1110010
    101
    1100101
    119
    1110111
    114
    1110010
    101
    1100101
    

    总结:不难发现,我们生活中的字符串中的英文大小写字母对应的是一个字节,每个字节都对应一个数字,
    一个字符串有多少英文字母就对应有多少数字,有多少个字节,而一个字节就对应 8 位的Bit (位),这个Bit(位)就是0或者1组成的

    那么上面看了英文,现在我们想想一个中文字母对应多少个字节?

    一个中文字对应多少个字节

    在UTF-8的编码格式下

    public class ByteBitDemo {
        public static void main(String[] args) {
            String a = "律";
            byte[] bytes = a.getBytes("utf-8");
            for (byte aByte : bytes) {
                int c = aByte;
                System.out.println(c);
            }
        }
    

    打印结果:

    -27
    -66
    -117
    

    可以看到:一个中文对应三个字节,把字节打印成Bit(位)看看:

    public class ByteBitDemo {
        public static void main(String[] args) {
            String a = "律";
            byte[] bytes = a.getBytes("utf-8");
            for (byte aByte : bytes) {
                int c = aByte;
                System.out.print(c + "  ");
                // 把字节转换成 位bit 打印
                String s = Integer.toBinaryString(c);
                System.out.println(s);
            }
        }
    

    打印结果:

    -27  11111111111111111111111111100101
    -66  11111111111111111111111110111110
    -117  11111111111111111111111110001011
    

    在GBK编码格式下

    public class ByteBitDemo {
        public static void main(String[] args) throws UnsupportedEncodingException {
            String a = "律";
            byte[] bytes = a.getBytes("GBK");
            for (byte aByte : bytes) {
                // int c = aByte;
                System.out.print(aByte + "  ");
                // 把字节转换成 位bit 打印
                String s = Integer.toBinaryString(aByte);
                System.out.println(s);
            }
        }
    

    打印结果:

    -62  11111111111111111111111111000010
    -55  11111111111111111111111111001001
    

    总结

    • 一个字节对应的8bit

    • 对于中文字,根据编码的格式不一样,对应的字节也不一样
      如果是UTF-8: 一个中文对应的是三个字节
      如果是GBK: 一个中文对应的两个字节
      英文不区分在什么编码格式下

    • 一个数字的字符串也是对应一个字节
      String a = “1”; 一个数字 1 对应的也是一个字节
      String a = “12343”; 这是5个数字的字符串对应的是5个字节

    这篇文章的疑虑
    一个字节不是对应8bit嘛?问什么在上面打印出来的Bit位数是32位呢?

    -73  11111111111111111111111110110111
    -24  11111111111111111111111111101000
    
    展开全文
  • 对big-endianlittle-endian的区别,很多人认为是对多字节数据类型而言。其实,问题的本质不在这里。 两种endian区别的本质是由于CPU的数据引脚系统地址总线的连接方向的不同。也就是说,高地址,低地址的区别...

    C语言的位域虽然很多人强烈建议不要使用,但现有系统里还广泛存在位域的使用,所以还是很有必要理清楚的。
    对big-endian和little-endian的区别,很多人认为是对多字节数据类型而言。其实,问题的本质不在这里。
    两种endian区别的本质是由于CPU的数据引脚和系统地址总线的连接方向的不同。也就是说,高地址,低地址的区别不仅体现在“字节序”上,还体现在“比特序”上,只不过因为系统屏蔽了“比特序”的一些细节,所以看起来问题仅仅是字节之间的顺序问题了。
    所以,对字节序相关的问题,如果能从两个角度来看问题,就很直接明了了。
    先从系统地址总线的角度来分析数据的存放,然后从CPU的数据引脚的角度来解析数据…(对网络字节,可从网络数据传送地址的角度分析数据的存放,思想类同)。

    字节序大小端

    如果将一个32位的整数0x12345678存放到一个整型变量(int) 中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本文使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。

    地址偏移 大端模式 小端模式
    0x00 12(OP0) 78 (OP3)
    0x01 34(OP1) 56 (OP2)
    0x02 56(OP2) 34(OP1)
    0x03 78(OP3) 12 (OP0)

    由上表所知,采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存 放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰 优孰劣也没有定论。
    有的处理器系统采用了小端方式进行数据存放,如Intel的奔腾。有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。
    因此在一个处理器系统中,有可能存在大端和小端模式同时存在的现象。这一现象为系统的软硬件设计带来了不小的麻烦,这要求系统设计工程师,必须深入理解大端和小端模式的差别。大端与小端模式的差别体现在一个处理器的寄存器,指令集,系统总线等各个层次中。
    大小端的分度值是 byte,即每一个byte都是按照正常顺序,但是byte组装成一个int 或者是 long等时每个byte的摆放位置不同。
    如何判别系统的大小端:

    //如果字节序为big-endian,返回true;
    //反之为   little-endian,返回false
    bool IsBig_Endian()
    {
        unsigned short test = 0x1234;
        if(*( (unsigned char*) &test ) == 0x12)
           return TRUE;
       else
           return FALSE;
    }//IsBig_Endian()
    

    比特位大小端

    struct kk 
    { 
      unsigned char a:2; 
      unsigned char b:3; 
      unsigned char c:2; 
      unsigned char d:1; 
    } 
    

    上方代码中,a,b,c,d称为位域或者段,各位域或段相互之间按数据结构中的顺序在存储器中按从低到高的顺序存储,与CPU的大小端无关。所以 a,b,c,d的地址是从低到高的。

      地址总线    低  》----》----》----》 高
                     a     b     c     d
    
    int main()
    {
      kk stuData;
      char cSrc=6;
      memcpy(&stuData, &cSrc, sizeof(stuData));
      printf("%d, %d, %d, %d\n", stuData.a, stuData.b, stuData.c, stuData.d);
      return 0;
    }
    

    在little-endian机器上,一个位域或段内部的低bit 放在内存的低bit地址处。
    在big-endian机器上,一个位域或段内部的高bit 放在内存的低bit地址处

    单字节内的比特位排列

    cSrc的二进制表示为0b00000110

    小端机器

    在little-endian机器上cSrc字节中各个比特的存放排列如下所示

      地址总线    低  》----》----》----》 高
                         01100000
    

    解析得到:
    stuData.a = 0b10 = 2
    stuData.b = 0b001 =1
    stuData.c = 0b00 = 0
    stuData.d = 0b0 = 0

    大端机器

    在big-endian机器上,cSrc字节中各个比特的存放排列如下所示

      地址总线    低  》----》----》----》 高
                         00000110
    

    解析得到:
    stuData.a = 0b00 = 0
    stuData.b = 0b000 = 0
    stuData.c = 0b11 = 3
    stuData.d = 0b0 = 0

    多字节内的比特位排列

    struct kk 
    { 
      unsigned short  a:2; 
      unsigned short  b:9; 
      unsigned short  c:4; 
      unsigned short  d:1; 
    } 
    int main()
    {
      kk stuData;
      unsigned short usSrc=0x1234;
      memcpy(&stuData, &cSrc, sizeof(stuData));
      printf("%d, %d, %d, %d\n", stuData.a, stuData.b, stuData.c, stuData.d);
      return 0;
    }
    

    cSrc的二进制表示为0b 0001 0010 0011 0100

    小端机器

    在little-endian机器上cSrc字节中各个比特的存放排列如下所示

      地址总线    低     》----》 ---- 》 ---- 》    高
      
      bit位    低bit位   bit0 bit1 ... bit14 bit5  高bit位   
      
                         00|10 1100 010|0 100|0
                         
                          a       b       c   d                         
    

    解析得到:
    stuData.a = 0b00 = 0
    stuData.b = 0b010 0011 01 = 141
    stuData.c = 0b0010= 4
    stuData.d = 0b0 = 0

    大端机器

    在big-endian机器上,cSrc字节中各个比特的存放排列如下所示

      地址总线    低      》 ----》 ----》 ----》   高
      
      bit位    高bit位   bit15 bit4 ... bit1 bit0  低bit位   
      
                         00|01 0010 001|1 010|0
                         
                         a         b      c   d
    

    解析得到:
    stuData.a = 0b00 = 0
    stuData.b = 0b01 0010 001 = 145
    stuData.c = 0b1010 = 10
    stuData.d = 0b0 = 0

    展开全文
  • 比特和字节 bit和byte

    2020-03-16 21:12:18
  • Ethernet下字节和bit序的总结 本文讲述的是在ethernet中多字节数据发送时涉及到字节和bit序的剖析。 关于字节序(大小端)和bit序,以及MSB和LSB的叙述,请另行学习,本篇不涉及。 正文开始: 对于多字节数据...

    Ethernet下字节序和bit序的总结

    本文讲述的是在ethernet中多字节数据发送时涉及到字节序和bit序的剖析。

    关于字节序(大小端)和bit序,以及MSB和LSB的叙述,请另行学习,本篇不涉及。

    正文开始:

    对于多字节数据的发送(ethernet上是一个字节一个字节的传送数据的,故,对于多字节的数据,必然存在要先发送哪个字节,后发送哪个字节的顺序问题),这个很多文章都讲清楚了,这里快速过一下:

    比如要发送4字节的int型数据0x12345678, 由于网络上要求的是大端字节序,那么要求发送的字节顺序为0x12,0x34,0x56,0x78.

    假如,当前系统为小端系统,那么0x12345678在内存中的分布如下:

    即在小端系统中,低位数据存储在低地址,高位数据存储在高位地址。

    如果,当前系统为大端系统,则0x12345678在内存中的分布如下:

    即在大端系统中,低位数据存储在高地址,高位数据存储在低地址。

    当网卡往外发送数据时,都是从低地址开始,一个字节一个字节的发送,直到所有数据发送完毕。

    当网卡接收数据时,将收到的字节存放在低地址,然后后面接收的字节按顺序存储在前一个字节的内存地址的下一个内存字节(地址升序)。

    按照上述的原理,假设,我们不遵从网络字节序(大端)的要求,小端系统pc1要发送数据0x12345678,则发送的字节依次为0x78, 0x56, 0x34, 0x12。

    接收端pc2收到的数据依次为0x78, 0x56, 0x34, 0x12。这些数据在接收端系统内存的分布和发送端是一样的,如下图:

    如果接收端pc2也是小端系统,那么这4个字节的数据会被解析成0x12345678,和发送端pc1一样,此时,不会有什么问题。

    但是,如果接收端pc2是大端系统,那么这4个字节的数据会被解析成0x78563412, 这就不是pc1想给pc2的数据了。

    如果pc1和pc2都遵从网络字节序,pc1在发送之前,先将0x12345678转成网络字节序,转换后的内存数据分布如下:

    然后再发送,这时的发送的字节依次为0x12, 0x34, 0x56, 0x78;接受端pc2也依次收到数据0x12, 0x34, 0x56, 0x78, 并存放在内存中,如下:

    然后pc2在使用这块内存中的数据之前,先将网络字节序转换成本地字节序。

    如果本地是大端字节序,则不变换,内存中的分布如下:

    这些数据在大端系统中被解析为0x12345678, 和发送端pc1的数据一致。

    如果本地是小端字节序,则进行大小端变换,变换后,内存中的分布如下:

    这些数据在小端系统中被解析为0x12345678, 和发送端pc1的数据一致。

     

    下面,我们要讲讲bit序的问题了(这个问题,到目前位置,我好像没有看到过有讲得很清楚的文章,而且有些讲的还是不正确的)。

    首先,我们要明确,网卡芯片发送和接收数据管脚,都只用一根,如下图的intel I210芯片:

    I210通过NC-SI(network controller side-band interface)接口连到MC(manageability controller),只使用NC_SI_TXD0和NCSI_RXD0。

    所以,网卡芯片发送数据,只在NC_SI_TXD0管脚,一个bit一个bit的发送。

    假设pc1要发送一个字节的数据,是怎么发送的呢?是先发送bit0还是bit7?与大小端系统中有什么联系?

    我们以内核中iphdr的定义为例:

    从上述定义中可知,如果是小端系统,那么定义bit0 ~ bit3为ihl, bit4 ~ bit7为version, 即:

    而RFC中定义的Ip头的结构如下:

    可以看到,ihl和version在本地定义和RFC中的定义是相反的,RFC中的定义如下:

    两则不一致,为什么能工作不出错呢?

    这里有一个很重要的信息,就是网卡要遵从的一个原则:就是在发送bit数据的时候,先发送MSB,最后发送LSB,即先发送最高有效bit位,最后发送最低有效bit位;网卡在接收bit数据的时候,同样认为,先收到MSB,最后收到的位LSB,即先收到最高有效bit,最后收到最低有效bit。

    小端系统,MSB为bit7, LSB为bit0

    大端系统,MSB为bit0, LSB为bit7

    比如,在小端系统中,网卡发送bit数据时,依次发送bit7, bit6, bit5, bit4, bit3, bit2,bit1,bit0.

    在大端系统中,网卡发送bit数据时,依次发送bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7.

    这样来看,内核中定义的iphdr结构和RFC上对应了起来。

    同样的,在小端系统,网卡收到bit数据时,依次存放在bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0.

    在大端系统中,网卡收到bit数据时,依次存放在bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7.

     

    展开全文
  • bit和字节Byte

    2020-05-07 14:50:00
    二进制中的0 1 是表示的是位,普通的1字节=8位,表示由八个位组成的一个单元。 位与字节区别与联系 1、bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范畴; Byte意为“字节”,是计算机文件大小的...
  • Java中字节bytebit的关系
  • 字长、字节Bit、Byte

    千次阅读 2015-11-30 11:18:50
    字长、字节Bit、Byte都是计算机中的度量单位,其中所谓Byte的中文翻译就是字节,计算机运行的最小单位是bitbit的中文翻译就是“位”。在计算机中玩游戏、办公等应用最后都是转换成计算机的二进制运算,可以说...
  • 1byte = 8bit char 占用2字节, 16bit int 占用4字节, 32bit long 占用8字节, 64bit double 占用8字节, 64bit     通常gbk/gb2312是2个字节,utf-8是3个字节。   ...
  • 比特Bit 字节Byte 区别
  • BIT 计算机用语:build in test 的缩写,即系统自检测,又称为 build in self test. 工业技术学士 Bachelor of Industrial Technology 的英文缩写。 Bit 一般是说明传感器的信号有几个BIT,是个计量单位。 ...
  • 比特(bit)和字节(byte)

    2020-11-12 16:09:49
    比特(bit)和字节(byte)
  • Byte(字节) Bit(比特)

    2017-07-14 16:16:00
    Bit ),也称 二进制位。  指 二进制中的一位,是信息的最小单位。 Bit 是 Bi nary digi t (二进制数位)的缩写。 Bit ( 比特 )可缩写成b(小写)     字节 (英语: Byte ),计算机信息 ...
  • 位, 字节和字 bit, byte and word

    千次阅读 2013-04-22 15:59:37
    bit和byte >与速度有关的是bit, 与容量有关的byte; (最好以大小写区分开来bit&Byte) >bit 位, 比特, 计算机运算的基础单位, 是二进制数的长度单位; e.g. 10011001是一个8位二进制数字; bps = bits per ...
  • 1 Byte 就是 1 个字节,1 个字节是由 8 个二进制位组成的。比如1111111,00000000等。 三、代表的内容不一样 Bit 只能代表一个内容,(0或者1,其中的一个),1 Byte 代表 256 个内容 = 2 的 8 次方。 bit 与 Byte 的...
  • 现在就来弄清楚比特(Bit)、字节(Byte)字节(Kbyte)究竟是什么意思,这样你就能理解它们了。 一个比特就是一个二进制数的最小单元,就像我们说我们能够拥有的最小金额的钱就是一分一样,只不过比特是在二...
  • Java| Java中字节ByteBit的关系

    千次阅读 2017-12-15 22:36:36
    Java中字节容量关系 1TB=1024GB TB是千千兆 1GB=1024MB GB是千兆 1MB=1024KB MB是兆 1KB=1024Byte KB是千字节 ...Byte(缩写B)月Bit(缩写b)的关系Byte:1B=8b 也就是说1字节等于8个比特.参考: http://www.cnblogs.
  • 比特(bit)和字节(Byte)

    2019-09-28 17:30:55
    比特(bit)和字节(Byte) 基础的内容就不说了,这里是一个小的学习笔记 比特和字节的写法差异与应用场景 标准的写法中,正如标题中写的那样,是通过大小写来区分比特和字节的:比特的b应该是小写,而字节的B是大写。...
  • 32位编译器: ... 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)  short int : 2个字节  int: 4个字节  unsigned int : 4个字节  float: 4个字节  double:
  • 一、字节(Byte)位(Bit) 1、Java 中的字节容量关系 1 GB = 1024 MB,GB:千兆 1 MB = 1024 KB,MB:兆 1 KB = 1024 B,KB:千字节,B 是 Byte 的缩写,即字节。 2、字节(Byte)位(Bit)的关系 (1)Bit——...
  • 位(bit):计算机内部数据存储的最小单位 字节(byte):计算机数据处理的基本单位,习惯上用大写B来...1B(byte,字节) = 8bit(位) 字符:计算机中使用的字母、数字、字符合 1024B=1KB 1024KB=1M 1024M=1G ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,144
精华内容 3,257
关键字:

字节和bit