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

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

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

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

至于计算机到底是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 plaincopy
  1. System.out.println(ByteOrder.nativeOrder());

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

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

代码如下:

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

执行结果如下:

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

java字节序、主机字节序和网络字节序扫盲贴相关推荐

  1. java转网络字节序_【转】网络字节序与主机字节序

    最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序 ...

  2. 网络字节序与主机字节序的相互转换

    1.网络字节序与主机字节序 在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换.说到网络字节序与主机字节序需要清晰了解以下几个概念. 字节序,顾名思义,指字节在内存中存储的顺序.比如一个 ...

  3. c语言主机字节序和网络字节序

    一.什么是字节序 字节序是指多字节数据在计算机内存中存储顺序,或者网络传输时各字节的传输顺序,字节序分为大端序和小端序. 大端序:高字节存储在低位地址,传输数据时高位在前: 小端序:低字节存储在低位地 ...

  4. 网络:认识网络字节序

    IP地址和端口号 在IP数据报头中,有两个IP地址,分别是IP地址和目的IP地址: 端口号是传输层协议中的内容: 是一个2字节16位的整数: 用来标识进程,让当前的操作系统知道数据应该交给哪一个进程进 ...

  5. 网络字节与主机字节转换 htons(), ntohl(), ntohs(),htons() 函数

    在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数. 网络字节顺序与本地字节顺序之间的转 ...

  6. linux java socket编程_深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

  7. java 主机字节序 网络字节序_主机字节序 与 网络字节序

    一.字节顺序 是指占用内存多于一个字节类型的数据在内存中的存放顺序. 计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的.所以,计算机的内部处理都是小端字节序. 但是,网络传输.文件储存. ...

  8. java字节序、主机字节序和网络字节序

    java程序员是幸福,因为相对于C/C++的不跨平台,JVM为我们屏蔽了大量的底层细节和复杂性,让我们能够将精力放在实现特定的业务逻辑上,所以使用java开发项目效率是比较高的.同时java程序员是悲 ...

  9. java 网络字节序转主机字节序_Linux下查看网络连接

    排查系统故障的时候,我们通常会需要查看某一进程是否监听了某一特定端口或者系统中所有监听端口列表等,这时候就需要用到系统提供的某些命令或文件了,下面总结了一些常用的获取系统网络连接的命令. 0x01 n ...

最新文章

  1. 【git】几大区概念
  2. UIScrollView 的代理方法简单注解
  3. Hive与Hbase结合使用
  4. 北京大学2016年高等代数与解析几何考研试题
  5. u盘序列号读取工具_硬盘读写工具
  6. CVS配置过程 (部分转)
  7. python xy不在第一维度_ValueError:x和y必须具有相同的第一个维度ipython 3.5
  8. esp8266 at接收数据中断时间_关于嵌入式系统中断优先级的一点思考
  9. 如何设计会员体系中心
  10. UML类图详解及rose中的画法
  11. php输入为空,ecshop搜索框内容为空提示用户输入内容
  12. “她经济”时代,兜售少女心的乙女游戏将成新风口?
  13. krpano使用示例
  14. java秃顶_【本人秃顶程序员】在Java中使用函数范式提高代码质量
  15. 年度绩效考核演示PPT模板
  16. js获取当前月、上一月和下一月
  17. 教授专栏54 | 香港科大商学院绿色金融研究小组:借鉴外地经验,培育绿色金融人才...
  18. 前端项目设置点击手机号码唤起拨号功能
  19. 前端页面上换行、根据后端返回的换行符(“↵”)进行换行展示(vue、v-html)
  20. focusky怎么制作html5,一款简单易上手的3D动态PPT制作软件Focusky

热门文章

  1. 2022.9.28号,C语言学习小记
  2. CRC/SoftPLC/OpenCASCADE/CAD/CAM/SVG开源项目收藏
  3. 深入理解bit_or和bit_and,bit_count
  4. 《UNIX网络编程》配置unp.h头文件
  5. 手机与软件兼容测试软件,如何使用Total Control手机软件兼容性测试?
  6. 作为程序员创业者,来谈一下“老罗与王自如对战”
  7. 数据库学习之sql语句基础
  8. 年末小激动!uimou.com终于通过谷歌广告联盟Google
  9. 英勇行动海豹突击队 感
  10. 中国Linux与微软斗法北京谋变,从水火不容到共生(转)