java字节序、主机字节序和网络字节序扫盲贴

java字节序、主机字节序和网络字节序扫盲贴java 程序员是幸福 因为相对于 C C 的不跨平台 JVM 为我们屏蔽了大量的底层细节和复杂性 让我们能够将精力放在实现特定的业务逻辑上 所以使用 java 开发项目效率是比较高的 同时 java 程序员是悲哀的 就是因为 JVM 屏蔽了很多技术细节 导致 java 程序员基本功普遍较差 对一些基本概念理解不深 甚至根本没有听说过 作为一个 java 程序员 我深深的感到自己知识面的狭窄 无意中看到了字节序 以前竟然

java程序员是幸福,因为相对于C/C++的不跨平台,JVM为我们屏蔽了大量的底层细节和复杂性,让我们能够将精力放在实现特定的业务逻辑上,所以使用java开发项目效率是比较高的。同时java程序员是悲哀的,就是因为JVM屏蔽了很多技术细节,导致java程序员基本功普遍较差,对一些基本概念理解不深,甚至根本没有听说过。作为一个java程序员,我深深的感到自己知识面的狭窄。无意中看到了字节序,以前竟然都不知道,这里记录下,扫个盲。

       使用C/C++进行网络编程的程序员,肯定会接触到“字节序”的概念,但是使用java进行网络编程,却根本不会接触到“字节序”。为什么会这样呢?我们先从字节序说起。字节顺序是指占用内存多于一个字节类型的数据在内存中的存放顺序,有小端、大端两种顺序。小端字节序(little endian):低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序(bigendian):高字节数据存放在低地址处,低字节数据存放在高地址处。

        java中一个int型数据占用4个字节,假如有一个16进制的int数,int value = 0x0;采用不同的字节序,在内存中的存储情况见下图:

java字节序、主机字节序和网络字节序扫盲贴

显然大字节序,是比较符合人类思维习惯的。

      至于计算机到底是BIG-ENDIAN、LITTLE-ENDIAN、跟CPU有关的,一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN。IA架构(Intel、AMD)的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola处理器是Big-Endian。这其实就是所谓的主机字节序。而网络字节序是指数据在网络上传输时是大头还是小头的,在Internet的网络字节序是BIG-ENDIAN。所谓的JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。可见网络和JVM都采用的是大字节序,个人感觉就是因为这种字节序比较符合人类的习惯。由于JVM会根据底层的操作系统和CPU自动进行字节序的转换,所以我们使用java进行网络编程,几乎感觉不到字节序的存在。

      那么java里面,怎么判断你的计算机是大端存储、还是小端存储呢?JDK为我们提供一个类ByteOrder,通过以下代码就可以知道机器的字节序

[java] 
view plain  
copy

  1. System.out.println(ByteOrder.nativeOrder());  

在java.nio包下提供了ByteOrder、ByteBuffer等于字节序相关的类,我们也可以改变JVM中默认的字节序。该例子来源于

http://blog.csdn.net/veryitman/article/details/

代码如下:

[java] 
view plain  
copy

  1. package net.aty.util;  
  2.   
  3.   
  4. import java.nio.ByteBuffer;  
  5. import java.nio.ByteOrder;  
  6. import java.util.Arrays;  
  7.   
  8. public class JVMEndianTest {  
  9.       
  10.     public static void main(String[] args) {  
  11.           
  12.         int x = 0x0;  
  13.           
  14.         ByteBuffer bb = ByteBuffer.wrap(new byte[4]);  
  15.         bb.asIntBuffer().put(x);  
  16.         String ss_before = Arrays.toString(bb.array());  
  17.           
  18.         System.out.println(“默认字节序 “ +  bb.order().toString() +  “,”  +  ” 内存数据 “ +  ss_before);  
  19.           
  20.         bb.order(ByteOrder.LITTLE_ENDIAN);  
  21.         bb.asIntBuffer().put(x);  
  22.         String ss_after = Arrays.toString(bb.array());  
  23.           
  24.         System.out.println(“修改字节序 “ + bb.order().toString() +  “,”  +  ” 内存数据 “ +  ss_after);  
  25.     }  
  26. }  


执行结果如下:

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214430.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:17
下一篇 2026年3月18日 下午4:17


相关推荐

  • SQL函数:SUBSTRING截取字符串

    SQL函数:SUBSTRING截取字符串SUBSTRING函数作用截取指定长度的字符SUBSTRING函数用法substring(string,start,length)说明:截取string字符串从start开始length长度的字符SUBSTRING函数使用举例下面举例:截取20181219中的1219字符串–截取目的字符串:1219declare@strvarchar(50)=’2…

    2022年5月24日
    69
  • 如何保证docker2375端口的安全

    如何保证docker2375端口的安全情景再现:之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口。由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,今天我们来聊聊如何解决这个问题。问题产生的原因首先我们要明白问题产生的原因,才能更好地解决问题!Docker为了实现集群管理,提供了远程管理的端口。DockerDaemon作为守护进程运行在后台,可以执行发送到管理端口上的Docker命令。当我们修改do

    2022年6月13日
    49
  • 红旗linux 桌面10 下载,想要红旗桌面操作系统10(RedFlag Desktop Linux10)的请联系红旗官方…「建议收藏」

    红旗linux 桌面10 下载,想要红旗桌面操作系统10(RedFlag Desktop Linux10)的请联系红旗官方…「建议收藏」当前红旗桌面操作系统10(RedFlagDesktopLinux10)已经正式推出,如果有需要下载或者安装光盘的用户建议联系红旗官方,以获知获取RedFlagDesktopLinux10的渠道,安装请参考红旗Linux系统RedFlagLinuxDesktop9.0安装教程。红旗桌面操作系统10亮点介绍RedFlagDesktopLinux10使用Linux4.18内…

    2022年8月22日
    6
  • bottleneck理解

    bottleneck理解bottleneck 简单翻译就是瓶颈层 一般在深度较高的网络 如 resnet101 中使用 一般结构如下图所示 其中两个 1X1fliter 分别用于降低和升高特征维度 主要目的是为了减少参数的数量 从而减少计算量 且在降维之后可以更加有效 直观地进行数据的训练和特征提取 对比如下图所示 参考博客 https www jianshu com p 243eehttps

    2026年3月20日
    3
  • hdu 3336 Count the string(kmp应用)

    hdu 3336 Count the string(kmp应用)ProblemDescriptionItiswellknownthatAekdyCoinisgoodatstringproblemsaswellasnumbertheoryproblems.Whengivenastrings,wecanwritedownallthenon-emptyprefixesofthisstring.

    2022年7月23日
    11
  • Java中JDBC的使用详解[通俗易懂]

    Java中JDBC的使用详解[通俗易懂]打个广告,帮朋友卖点东西,东西超便宜的哟【衣服鞋子等】,厂家直接出货,绝对低于市场价!!!一般都比市场价便宜3—7折【都是牌子货】,如果您感兴趣,可以扫描屏幕下方的二维码,感谢关注!!!微信一、环境介绍在mysql中创建一个库shen,并创建user表和插入表的数据。 新建一个Java工程jdbc,并导入数据驱动。二、详细步骤1、加载数据库驱动//1.加载…

    2022年8月10日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号