Java_NetWork_Java字节序

本文通过示例代码展示了Java虚拟机(JVM)如何处理不同字节序的数据存储,包括默认大端序和修改为小端序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面两篇博客中,介绍了字节序和网路字节序。

如果你有兴趣的话,可以访问 Java_NetWork_Endianness-字节序、 Java_NetWork_Endian相关的几个函数

这篇博客主要说说JavaVM与字节序,通过一个例子来说明。

我们知道,不同的cpu或者是相同的cpu不同的操作系统,内存存储数据的机制也不一样!

但是Java虚拟机是如何存储数据的呢,换个话说,JVM是大端序还是小端序?举个例子吧!

package mark.zhang;

import java.nio.ByteBuffer;
import java.util.Arrays;

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);
	}
}

运行这个demo,得到结果应该是这样子的:

默认字节序 BIG_ENDIAN, 内存数据 [1, 2, 3, 4]

可以看出,JVM的字节序是大端序。那麽,是否可以改变JVM的字节序呢?先看下面的例子,再来回答这个问题。

该例子,只是使用ByteBuffer这个类的方法来说明问题。

package mark.zhang;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;

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);
	}
}


Run as javaapp 输出结果:

默认字节序 BIG_ENDIAN, 内存数据 [1, 2, 3, 4]
修改字节序 LITTLE_ENDIAN, 内存数据 [4, 3, 2, 1]

ok,说到这里吧!

如果有兴趣的话,可以研究一下ByteBuffer这个类。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值