- 浏览: 7185896 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (397)
- 架构研究 (44)
- 网络协议-TCP/HTTP (20)
- SPRING (23)
- HIBERNATE 3 (30)
- STRUTS 2 (20)
- Java/J2se (25)
- Servlet/Jsp (9)
- 开发工具IDE (10)
- WEB服务器 (17)
- 前端--Java Script (33)
- 前端--CSS (7)
- OS--Linux (31)
- OS--MAC OS (19)
- MySQL数据库 (19)
- Oracle数据库 (11)
- 项目管理工具 (12)
- 数据报表技术 (4)
- 图像处理技术 (10)
- 其它综合技术 (13)
- 权限管理 (1)
- MyBatis (1)
- 网络安全 (6)
- IO (21)
- PostgreSQL (2)
- Eclipse RCP (1)
- GWT (1)
- 算法 (3)
- Storm (2)
- zookeeper (3)
- 消息 (1)
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
作者:赵磊
博客:http://elf8848.iteye.com
字节序,顾名思义就是字节存放的顺序
字节序分为两种:
BIG-ENDIAN----大字节序
LITTLE-ENDIAN----小字节序
BIG-ENDIAN、LITTLE-ENDIAN与多字节类型的数据有关的比如int,short,long型,而对单字节数据byte却没有影响。
BIG-ENDIAN就是最低地址存放最高有效字节。
LITTLE-ENDIAN是最低地址存放最低有效字节。即常说的低位在先,高位在后。
Java中int类型占4个字节,一定要是“多字节类型的数据”才有字节序问题,汉字编码也有这个问题。请看下面4字节的例子:
比如 int a = 0x05060708
在BIG-ENDIAN的情况下存放为:
低地址------->高地址
字节号: 第0字节,第1字节,第2字节,第3字节
数 据: 05 , 06 , 07 , 08
在LITTLE-ENDIAN的情况下存放为:
低地址------->高地址
字节号: 第0字节,第1字节,第2字节,第3字节
数 据: 08 , 07 , 06 , 05
JAVA字节序:
指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。
主机字节序:
Intel的x86系列CPU是Little-Endian,而PowerPC 、SPARC和Motorola处理器是BIG-ENDIAN。
ARM同时支持 big和little,实际应用中通常使用little endian。是BIG-ENDIAN还是LITTLE-ENDIAN的跟CPU有关的,每一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN。
网络字节序:
4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序(BIG-ENDIAN)。 TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序。
不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
处理器 操作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian
所以在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。如果通信的一方是JAVA程序、一方是C/C++程序时,则需要在C/C++一侧使用以上几个方法进行字节序的转换,而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG-ENDIAN,只要C/C++一侧能正确进行转换即可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。
java中转换字节序
方案一:通过ByteBuffer实现
ByteBuffer类中的order(ByteOrder bo) 方法可以设置 ByteBuffer 的字节序。
其中的ByteOrder是枚举:
ByteOrder BIG_ENDIAN 代表大字节序的 ByteOrder 。
ByteOrder LITTLE_ENDIAN 代表小字节序的 ByteOrder 。
ByteOrder nativeOrder() 返回当前硬件平台的字节序。
方案二:自己写代码实现(原自网络)
package com.xxx; /** * 通信格式转换 * * Java和一些windows编程语言如c、c++、delphi所写的网络程序进行通讯时,需要进行相应的转换 高、低字节之间的转换 * windows的字节序为低字节开头 linux,unix的字节序为高字节开头 java则无论平台变化,都是高字节开头 */ public class FormatTransfer { /** * 将int转为低字节在前,高字节在后的byte数组 * * @param n * int * @return byte[] */ public static byte[] toLH(int n) { byte[] b = new byte[4]; b[0] = (byte) (n & 0xff); b[1] = (byte) (n >> 8 & 0xff); b[2] = (byte) (n >> 16 & 0xff); b[3] = (byte) (n >> 24 & 0xff); return b; } /** * 将int转为高字节在前,低字节在后的byte数组 * * @param n * int * @return byte[] */ public static byte[] toHH(int n) { byte[] b = new byte[4]; b[3] = (byte) (n & 0xff); b[2] = (byte) (n >> 8 & 0xff); b[1] = (byte) (n >> 16 & 0xff); b[0] = (byte) (n >> 24 & 0xff); return b; } /** * 将short转为低字节在前,高字节在后的byte数组 * * @param n * short * @return byte[] */ public static byte[] toLH(short n) { byte[] b = new byte[2]; b[0] = (byte) (n & 0xff); b[1] = (byte) (n >> 8 & 0xff); return b; } /** * 将short转为高字节在前,低字节在后的byte数组 * * @param n * short * @return byte[] */ public static byte[] toHH(short n) { byte[] b = new byte[2]; b[1] = (byte) (n & 0xff); b[0] = (byte) (n >> 8 & 0xff); return b; } /** * 将将int转为高字节在前,低字节在后的byte数组 public static byte[] toHH(int number) { int * temp = number; byte[] b = new byte[4]; for (int i = b.length - 1; i > -1; * i--) { b = new Integer(temp & 0xff).byteValue(); temp = temp >> 8; } * return b; } public static byte[] IntToByteArray(int i) { byte[] abyte0 = * new byte[4]; abyte0[3] = (byte) (0xff & i); abyte0[2] = (byte) ((0xff00 & * i) >> 8); abyte0[1] = (byte) ((0xff0000 & i) >> 16); abyte0[0] = (byte) * ((0xff000000 & i) >> 24); return abyte0; } */ /** * 将float转为低字节在前,高字节在后的byte数组 */ public static byte[] toLH(float f) { return toLH(Float.floatToRawIntBits(f)); } /** * 将float转为高字节在前,低字节在后的byte数组 */ public static byte[] toHH(float f) { return toHH(Float.floatToRawIntBits(f)); } /** * 将String转为byte数组 */ public static byte[] stringToBytes(String s, int length) { while (s.getBytes().length < length) { s += " "; } return s.getBytes(); } /** * 将字节数组转换为String * * @param b * byte[] * @return String */ public static String bytesToString(byte[] b) { StringBuffer result = new StringBuffer(""); int length = b.length; for (int i = 0; i < length; i++) { result.append((char) (b[i] & 0xff)); } return result.toString(); } /** * 将字符串转换为byte数组 * * @param s * String * @return byte[] */ public static byte[] stringToBytes(String s) { return s.getBytes(); } /** * 将高字节数组转换为int * * @param b * byte[] * @return int */ public static int hBytesToInt(byte[] b) { int s = 0; for (int i = 0; i < 3; i++) { if (b[i] >= 0) { s = s + b[i]; } else { s = s + 256 + b[i]; } s = s * 256; } if (b[3] >= 0) { s = s + b[3]; } else { s = s + 256 + b[3]; } return s; } /** * 将低字节数组转换为int * * @param b * byte[] * @return int */ public static int lBytesToInt(byte[] b) { int s = 0; for (int i = 0; i < 3; i++) { if (b[3 - i] >= 0) { s = s + b[3 - i]; } else { s = s + 256 + b[3 - i]; } s = s * 256; } if (b[0] >= 0) { s = s + b[0]; } else { s = s + 256 + b[0]; } return s; } /** * 高字节数组到short的转换 * * @param b * byte[] * @return short */ public static short hBytesToShort(byte[] b) { int s = 0; if (b[0] >= 0) { s = s + b[0]; } else { s = s + 256 + b[0]; } s = s * 256; if (b[1] >= 0) { s = s + b[1]; } else { s = s + 256 + b[1]; } short result = (short) s; return result; } /** * 低字节数组到short的转换 * * @param b * byte[] * @return short */ public static short lBytesToShort(byte[] b) { int s = 0; if (b[1] >= 0) { s = s + b[1]; } else { s = s + 256 + b[1]; } s = s * 256; if (b[0] >= 0) { s = s + b[0]; } else { s = s + 256 + b[0]; } short result = (short) s; return result; } /** * 高字节数组转换为float * * @param b * byte[] * @return float */ public static float hBytesToFloat(byte[] b) { int i = 0; Float F = new Float(0.0); i = ((((b[0] & 0xff) << 8 | (b[1] & 0xff)) << 8) | (b[2] & 0xff)) << 8 | (b[3] & 0xff); return F.intBitsToFloat(i); } /** * 低字节数组转换为float * * @param b * byte[] * @return float */ public static float lBytesToFloat(byte[] b) { int i = 0; Float F = new Float(0.0); i = ((((b[3] & 0xff) << 8 | (b[2] & 0xff)) << 8) | (b[1] & 0xff)) << 8 | (b[0] & 0xff); return F.intBitsToFloat(i); } /** * 将byte数组中的元素倒序排列 */ public static byte[] bytesReverseOrder(byte[] b) { int length = b.length; byte[] result = new byte[length]; for (int i = 0; i < length; i++) { result[length - i - 1] = b[i]; } return result; } /** * 打印byte数组 */ public static void printBytes(byte[] bb) { int length = bb.length; for (int i = 0; i < length; i++) { System.out.print(bb + " "); } System.out.println(""); } public static void logBytes(byte[] bb) { int length = bb.length; String out = ""; for (int i = 0; i < length; i++) { out = out + bb + " "; } } /** * 将int类型的值转换为字节序颠倒过来对应的int值 * * @param i * int * @return int */ public static int reverseInt(int i) { int result = FormatTransfer.hBytesToInt(FormatTransfer.toLH(i)); return result; } /** * 将short类型的值转换为字节序颠倒过来对应的short值 * * @param s * short * @return short */ public static short reverseShort(short s) { short result = FormatTransfer.hBytesToShort(FormatTransfer.toLH(s)); return result; } /** * 将float类型的值转换为字节序颠倒过来对应的float值 * * @param f * float * @return float */ public static float reverseFloat(float f) { float result = FormatTransfer.hBytesToFloat(FormatTransfer.toLH(f)); return result; } }
发表评论
-
在浏览器中解析Base64编码图像
2014-05-25 17:25 7987上一篇介绍中,我们将二进制文件(BLOB)保存为Base64 ... -
细说Java IO相关
2014-05-25 13:48 4821细说Java IO相关 概述 在大部分的行业系统或 ... -
Java IO 的类图
2014-05-25 13:43 2091Java IO 的类图 拿出来方便大家。Java IO表 ... -
Java IO流学习总结
2014-05-25 13:35 3485Java流操作有关的类或 ... -
JAVA多线程和并发基础面试问答
2014-05-17 23:58 3932原文链接 译文连接 ... -
Java开发字符界面程序
2014-01-14 15:27 2731做银行、保险等行业,需要开发柜面系统,使用unix终端进行 ... -
JVM 优秀文章
2013-11-29 11:16 2139JVM垃圾收集器使用调查:CMS最受欢迎 http:// ... -
Java写的数据库连接池
2013-10-19 22:42 0Java写的数据库连接池 impo ... -
Web应用程序中线程的启动和关闭问题
2013-09-12 18:49 3435我们知道静态变量是ClassLoader级别的,如果Web ... -
Java线程池知识
2013-04-08 10:39 26741. 引言合理利用线程池能够带来好处。第一:降低资源消耗。通 ... -
子类可以继承到父类上的注解吗--有结论了
2012-08-04 23:51 57623作者:赵磊 博客:http://elf8848.ite ... -
JDK 5 Annotation\注解\注释\自定义注解
2012-08-04 22:15 10912作者:赵磊 博客:ht ... -
Java Nio Buffer
2012-05-29 15:21 7120Buffer是特定基本类型元素的线性有限序列,它以及它的子类定 ... -
ScheduledExecutorService执行定时任务
2012-05-23 14:59 27786ScheduledExecutorService ... -
Java 高级知识
2012-05-18 18:34 15752Java 的一些高级知识你掌握了吗? 我最近在做一个网络通 ... -
Java日志方案概述
2012-04-29 18:33 4949日志解决方案 ... -
Map的线程安全与否的相关文章
2010-05-20 22:09 3325为什么HashMap不是线程安全的?哪里不安全?不安全产生什 ... -
Map.Entry 类使用简介
2009-09-17 15:46 14648如何简便的遍历Map 你是否已经对每次从Map中取得关键字然 ... -
嵌套删除多级目录, 删除单级目录, 创建多级目录, 复制文件
2009-02-25 17:53 3469备一份自己用: /** * 嵌套删除多级目录 * ... -
截取中英文混合的字符串, 保留前面N个字符 ,抛弃被截断的汉字
2009-02-25 17:47 5007备一份自己用: /** * 截取中英文混合的字符串, 保留 ...
相关推荐
### 字节序的基础概念 字节序,又称为字节顺序或字节排列方式,指的是在计算机内存中或网络传输过程中多字节数据的存储顺序。简单来说,它定义了多字节数据中各个字节如何按顺序排列。在实际编程工作中,尽管很多...
IP、主机字节序、网络字节序、互转 ------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using ...
网络字节序和主机字节序 在计算机科学中,字节序(Endianness)是指整数在内存中保存的顺序。不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。 常见的有两种字节序:...
《本地字节序和网络字节序:理解与应用》 在计算机科学中,字节序(Byte Order)指的是多字节数据类型在内存中存储时,其各个组成字节的排列顺序。这一概念对于理解数据在网络传输以及跨平台编程中至关重要。本文将...
"字节序与位序详解" 字节序(Byte Order)和位序(Bit Order)是计算机系统中两个重要的概念,它们决定了计算机系统如何存储和处理多字节整数。在本文中,我们将详细介绍字节序和位序的定义、类型、特点以及在...
利用宏将网络字节序和主机字节序ip格式化输出为字符串ip
### 大小端字节序概念与转换 #### 一、引言 在计算机系统中,数据的存储和传输方式至关重要。特别是在网络通信领域,不同的系统可能会采用不同的字节序来存储多字节数据,这可能导致数据解释上的不一致。因此,理解...
字节序分为两种类型:大端字节序(Big-Endian)和小端字节序(Little-Endian)。理解这两种字节序对于进行跨平台的网络通信至关重要,因为不同的处理器架构可能使用不同的字节序。例如,PowerPC和SPARC通常使用大端...
float字节序高低位转换.txt
项目中需要64位数的字节序转换,主机序转换成网路序或者相反转换,写了2个函数,有需要的可以参考。
高字节序,低字节序讲解。高字节序,低字节序讲解。高字节序,低字节序讲解
用C语言写的判断主机字节序的代码,一共有2种方法判断
在跨平台的网络编程中,字节序转换函数如htonl(主机到网络字节序,long)、ntohl(网络到主机字节序,long)、htons(主机到网络字节序,short)和ntohs(网络到主机字节序,short)非常常见,它们确保数据在网络上...
网络字节序与主机字节序
判断主机到底是大端还是小端的c程序!利用位置判断
Java 网络字节序转换是编程过程中一个重要的概念,尤其在跨平台通信和处理二进制数据时。字节序是指多字节数据(如整数或浮点数)在内存或文件中存储的顺序。主要有两种字节序:Big-Endian(大端字节序)和 Little-...
二进制杂谈 1、十进制、二进制、十六进制 2、计算机储存单位 3、进制转换 4、有符号编码 5、反码的设计原理 6、二进制的位运算 7、位操作符 8、内存与内存地址 9、字节序 10、Java解码 11、Java编码
网络字节序是计算机网络通信中的一个重要概念,它涉及到数据在网络中的传输方式。在不同的计算机系统中,数据存储的顺序可能会有所不同,这被称为字节序。主要有两种字节序:大端字节序(Big-Endian)和小端字节序...
网络字节序 主机字节序
在计算机科学中,字节序是一个至关重要的概念,特别是在跨平台通信和网络编程中。字节序,又称端序或尾序,定义了多字节数据如何在内存中存储和在网络上传输。Endianness这一术语源于乔纳森·斯威夫特的《格列佛游记...