博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解大小端字节序
阅读量:3725 次
发布时间:2019-05-22

本文共 2144 字,大约阅读时间需要 7 分钟。

更多干货

学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题。


什么是字节序?

    字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序

    

    那么就很明显了,像char这样的类型,肯定不存在字节序的问题了。


字节序分为哪几类?

大端字节序

     高位字节数据存放在低地址处,低位数据存放在高地址处;

小段字节序

     高位字节数据存放在高地址处,低位数据存放在低地址处;


网络字节序:

     TCP/IP协议传输数据时,字节序默认大端


    其实字节序只有大端字节序和小端字节序两种,网络字节序也是大端,这个以后会说到。关于大小端字节序的重点,上面已经标的很明显了,一个是高低地址,一个是高低位字节,那下面就看看这两个是什么意思?


重点来了


首先看什么是高地地址


     在内存中,栈是向下生长的,以char arr[4]为例,(因为char类型数据只有一个字节,不存在字节序的问题)依次输出每个元素的地址,可以发现,arr[0]的地址最低,arr[3]的地址最高,如图:

 

接下来看什么是高低位

     

     给一个十进制整数,123456,很明显左边的是高位,右边的是低位。计算机也是这样认为的。给一个16进制数,0x12345678,以字节为单位,从高位到低位依次是 0x12、0x34、0x56、0x78。


下来将高地地址和高低位对应。

     一个整形占4个字节,给一个整形数据0x12345678,如果是大端存储,存储格式如下:

如果是小端存储,存储格式如下:

那如何判断当前系统是大端还是小端呢?


    最简单地来说,我们可以用 1 为例,1在栈中存储的大小端格式分别如下图所示,


    如果我们可以得到 1 在内存中存储的第一个字节,那么我们就可以知道当前系统是大端存储还是小端存储了。

以下是将int 类型转换成磁盘存储的二进制。使用大端存储的方式

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.Arrays;public class Test1 {	public static void main(String[] args) throws IOException {		int id = 101;		int age = 21;				ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();		arrayOutputStream.write(int2bytes(id));		arrayOutputStream.write(int2bytes(age));				byte[] byteArray = arrayOutputStream.toByteArray();				System.out.println(Arrays.toString(byteArray));				//==============================================================		ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(byteArray);		byte[] idBytes = new byte[4];		arrayInputStream.read(idBytes);		System.out.println("id:" + bytes2int(idBytes));				byte[] ageBytes = new byte[4];		arrayInputStream.read(ageBytes);		System.out.println("age:" + bytes2int(ageBytes));			}			/**	 * 大端字节序列(先写高位,再写低位)	 * 百度下 大小端字节序列	 * @param i	 * @return	 */	public static byte[] int2bytes(int i){		byte[] bytes = new byte[4];		bytes[0] = (byte)(i >> 3*8);		bytes[1] = (byte)(i >> 2*8);		bytes[2] = (byte)(i >> 1*8);		bytes[3] = (byte)(i >> 0*8);		return bytes;	}			/**	 * 大端	 * @param bytes	 * @return	 */	public static int bytes2int(byte[] bytes){		return (bytes[0] << 3*8) |				(bytes[1] << 2*8) |				(bytes[2] << 1*8) |				(bytes[3] << 0*8);	}}

转载地址:http://jclnn.baihongyu.com/

你可能感兴趣的文章
2021-06-09阿里面试补充
查看>>
15.原型链总结
查看>>
16.js常用异步编程解决方案***
查看>>
js16:从输入url开始,前端如何优化
查看>>
2021-06-15滴滴面试补充
查看>>
2021-06-17网易面试补充
查看>>
2021-06-21网易面试补充
查看>>
2021“中兴捧月“图灵赛道总结
查看>>
【最新】python爬取全国主要城市经纬度
查看>>
python颜值分析
查看>>
python表白代码,照片隐藏表白话语!
查看>>
python报错cannot import name ‘BeautifulSoup‘ from ‘bs4‘
查看>>
记录博客第一次上热门
查看>>
python爬虫实战(2)——爬取知乎热榜内容
查看>>
python爬虫实战(1)——爬取知乎热门回答图片
查看>>
用户线程和守护线程
查看>>
线程组的使用
查看>>
synchronized关键字
查看>>
线程安全的实现方法
查看>>
ReentrantLock锁详解
查看>>