字节序指的是数据存储的顺序问题,分为Big-Endian和Little-Endian,Big-Endian指的是数据中的高位存储在存储器的低位,Little-Endian正好相反。Big-Endian也叫大头在前,Little-Endian叫做小头在前。
举例而言,有一个4字节的数据0x01020304,要存储在内存中或文件中编号0~3字节的位置,两种字节序的排列方式分别如下:
Big Endian
低地址 高地址
----------------------------------------->
地址编号
| 0 | 1 | 2 | 3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 01 | 02 | 03 | 04 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
----------------------------------------->
地址编号
| 0 | 1 | 2 | 3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 04 | 03 | 02 | 01 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
如果按照我们一般的书写习惯来说,Big-Endian似乎更好一点。
具体应用中是用big还是little就要取决于系统平台了。不同的CPU会有不同的情况,比如说x86架构的cpu使用的是little模式,而PowerPC则是big。C/C++语言对数据的处理取决于其运行的CPU,而Java则统一使用big模式。
如果单纯仅是使用Java的话也就不存在大小字节序的处理问题,但有时候Java程序可能还要使用到C/C++这类语言生成的数据,尤其是在我们常用x86环境下,两种语言的字节序就会出现不一致的问题,必须做一定的处理。
处理的方法很简单,就是把数据按字节前后调换一下就可以了。
在这里是将长度为len的数据转换成字节数组str[len],带入以下函数,如果原始数据是little,也就是big=false的情况下,函数将对数据进行高低位的调换,并返回。
publicstaticbyte[] ReversEndian(byte str[],int len, boolean big)
{
byte b;
byte res[]=newbyte[len];
for(int i=0;i<len;i++)
{
res[i]=str[i];
}
if(big==false)
{
for(int i=0;i<len;i++)
{
b=str[i];
res[len-i-1]=b;
}
}
return res;
}
假设现在我们需要从一个C/C++语言生成的二进制文件中读出一个float数据,可以如下处理。
//文件名
String fileName="file";
//float变量是4字节长
byte b[]=newbyte[4];
ByteBuffer bb;
File file=new File(fileName);
FileInputStream fis=new FileInputStream(file);
//从文件中读取一个4字节数据
fis.read(b);
//反转
b=ReversEndian(b,4,false);
//将字节数组还原成浮点数值
bb=ByteBuffer.wrap(b);
float value=bb.getFloat();
分享到:
相关推荐
/* java二进制,字节数组,字符,十六进制,BCD编码转换2007-06-07 00:17/** *//** * 把16进制字符串转换成字节数组 * @param hex * @return */
JAVA二进制字节数组字符十六进制BCD编码转换
最近由于工作上的需要,遇到进制转换的问题。涉及到的进制主要是 十进制,十六进制,二进制中间的转换。还包括了一个字节数组 与十六进制字符串的互相转换。估计遇到蓝牙通信的朋友,应该用的上。
二进制数组转换为二进制字符串 将二进制数组转换为十六进制字符串 将十六进制转换为二进制字节数组 将十六进制转换为二进制字符串
正整数的十进制转换二进制 将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取除得的余数,即换算为二进制数的结果。只需记住要点:除二取余,倒序排列。 由于计算机内部表示数的字节...
让你轻松搞定word到二进制流的转换,你值得拥有的技术,总会用到的,看见了就收藏一下吧
二进制杂谈 1、十进制、二进制、十六进制 2、计算机储存单位 3、进制转换 4、有符号编码 5、反码的设计原理 6、二进制的位运算 7、位操作符 8、内存与内存地址 9、字节序 10、Java解码 11、Java编码
16进制单精度(32位)浮点型转换器,含有大端(左高位)、小端(右高位)
netty通信时经常和底层数据交互,C语言和java的数据类型和范围不同,通信时需要转化或兼容,附件为字节码、进制常用的转换类。
二进制字符串转换成十六进制字符串,并返回byte数组 把16进制字符串转换成字节数组 把字节数组转换成16进制字符串 十六进制字符串转二进制字符串 二进制转十进制数 将数字(十进制)串转换为固定位数的二进制字符...
实现将二进制字节数据编码转换为base64的字符串数据,以及将base64字符串转换回二进制字节数据,位操作。
1.3 读入和写出二进制数据 1.3.1 随机访问文件 1.4 ZIP文档 1.5 对象流与序列化 1.5.1 理解对象序列化的文件格式 1.5.2 修改缺省的序列化机制 1.5.3 序列化单例和类型安全的枚举 1.5.4 版本管理 1.5.5 为克隆使用...
该工具能够实现二进制、八进制、十进制、十六进制之间的相互转换,同时能够进行浮点数的转换。以及介绍了浮点数的标准表示法
我们知道,在java中,一个byte 就是一个字节,也就是八个二进制位;而4个二进制位就可以表示一个十六进制位,所以一个byte可以转化为2个十六进制位。下面我们就来详细看下具体方法吧。
您可以读取任何文件并将其存储在字节数组中,如下所示:byte [] bytes = File.ReadAllBytes(“ filename.ext”);
对于单个的基本类型的数据(byte、short、long、BOOL)等类型的数据,以及有很多字节组成的可见英文字符、汉字等组成的字符串(LPCTSTR、BSTR类型都会进行编码转换)来说,使用VC的ActiveX项目向导可以方便地实现;...
[Java]IEEE754浮点数的转换方法,方法都写好了,直接复制过去就可以用了,就这么简单!
value根据实际的类型转换为二进制保存。二级制保存文件本身包含格式信息,但只包含层级和基本类型,不包含属性名使用方式Bson bson = new Bson();文档梳理【腾讯文档】Bson格式设计1字节Version + 对象数据对象数据...
软件特别增强了对于二进制文件编辑的支持,可以分组显示HEX值,可以把选中的HEX字节转换成C/C++、Java、Pascal数组形式,支持HEX编辑的 REDO/UNDO,亮显编辑过的HEX字节。支持把文本文件转换成HTML格式,同时还保持...
通过Java编译器编译生成的是二进制字节码文件,其扩展名为.class。 调用applet小程序的HTML文件的扩展名为.html或.htm。 2. Java语言的执行模式是半编译和半解释型。Java编写好的程序首先由编译器转换为标准字节...