字节顺序是指占用内存多于一个字节类型的数据在内存中的存放顺序,有小端、大端两种顺序。
注意:字节序是面向多字节类型定义的,比如2字节、4字节、8字节整型、长整型、浮点型等,单字节的字符串一般不用考虑。
16进制数据0x1234的二进制表示为:0001 0010 0011 0100,占用2个字节,分别为十六进制的12和34。以该数据分别以大端和小端格式存储。
在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 | 0x4000 | 0x4001 |
---|---|---|
存放内容 | 0x34 | 0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 0x4000 | 0x4001 |
---|---|---|
存放内容 | 0x12 | 0x34 |
如果以不同的方式读取,则会发生错误。
至于计算机到底是BIG-ENDIAN、LITTLE-ENDIAN、跟CPU有关的,一种CPU不是BIG-ENDIAN就是LITTLE-
ENDIAN。IA架构(Intel、AMD)的CPU中是Little-Endian,而PowerPC 、MIPS UNIX、HP-PA
UNIX、SPARC和Motorola处理器是Big-Endian。
网络字节序是指数据在网络上传输时是大端还是小端的,在Internet的TCP/IP协议规定了一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用
大端 字节序。
JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是 大端 字节序。
那么Jvm是怎么判断你的计算机是大端存储、还是小端存储呢?JDK为我们提供一个类ByteOrder,通过以下代码就可以知道机器的字节序
System.out.println(ByteOrder.nativeOrder());
在java.nio包下提供了ByteOrder、ByteBuffer等于字节序相关的类,我们也可以改变JVM中默认的字节序。
public class JVMEndianTest {
public static void main(String[] args) {
int x = 0x01020304;
ByteBuffer bb = ByteBuffer.wrap(new byte[4]);
bb.asIntBuffer().put(x);
String ss_before = Arrays.toString(bb.array());
System.out.println("默认字节序 " + bb.order().toString() + "," + " 内存数据 " + ss_before);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.asIntBuffer().put(x);
String ss_after = Arrays.toString(bb.array());
System.out.println("修改字节序 " + bb.order().toString() + "," + " 内存数据 " + ss_after);
}
Wav文件则是 小端 字节序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。