Java的二进制文件字节序转换
烤鱼片(@eii.dlmu)
cleverysm@163.com
字节序指的是数据存储的顺序问题,分为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();
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cleverysm/archive/2007/12/10/1927163.aspx
分享到:
相关推荐
Java 网络字节序转换是编程过程中一个重要的概念,尤其在跨平台通信和处理二进制数据时。字节序是指多字节数据(如整数或浮点数)在内存或文件中存储的顺序。主要有两种字节序:Big-Endian(大端字节序)和 Little-...
Java字节码转换工具Retrotranslator是一个用于解决软件兼容性问题的实用工具,尤其是在Java版本升级带来的不兼容性上。随着Java技术的不断迭代,新版本的特性常常不能在旧版本的JDK环境下运行,而Retrotranslator的...
Java中的默认字节序是网络字节序,也就是大端字节序。 2. **解析过程**:将16进制字符串转换为浮点数,通常涉及以下步骤: - 将16进制字符串转换为字节数组,每个字节对应一个16进制字符。 - 根据字节序调整字节...
本教程将详细讲解如何使用Java实现字节流来转换和处理图片。 首先,我们需要理解字节流的概念。在Java中,字节流分为两种类型:输入字节流(InputStream)和输出字节流(OutputStream)。它们分别用于读取和写入...
字节序转换辅助类,short大小端转换,ushort大小端转换,int大小端转换,uint大小端转换,long大小端转换,ulong大小端转换; short类型 小端转大端,short类型 大端转小端,int类型 小端转大端,int类型 大端转小端...
- `bytesToHexString()`方法遍历字节数组,将每个字节转换为十六进制字符串,并确保结果始终为两位。 3. **BCD编码** - BCD编码是一种特殊形式的二进制编码,用于表示十进制数。每个十进制数字用四位二进制表示,...
对于字节序转换,Java提供了`java.nio.ByteOrder`类,可以方便地在大端和小端之间切换。 PHP是另一种常用的Web开发语言,其文件操作主要通过`fopen`、`fwrite`和`fread`等函数完成。在网络字节流方面,PHP提供了`...
在Java编程语言中,将字节转换为十六进制是一个常见的任务,特别是在处理二进制数据、加密解密、网络通信等领域。一个字节(byte)由8位(bit)组成,而十六进制(Hexadecimal)是一种用16个符号(0-9和A-F)来表示...
Java字节数组与常见类型转换工具,包括byte[] 与int long double float string boolean 等类型的相互转换。
二进制杂谈 1、十进制、二进制、十六进制 2、计算机储存单位 3、进制转换 4、有符号编码 5、反码的设计原理 6、二进制的位运算 7、位操作符 8、内存与内存地址 9、字节序 10、Java解码 11、Java编码
char short int long float double 转换成byte数组
本教程将详细讲解如何使用Java实现字节流与图片之间的转换,这对于在网络上传输或者存储图片等二进制数据至关重要。 首先,我们需要了解Java中的字节流。Java提供了两种类型的字节流:输入流(InputStream)和输出...
1. 将字节数组转换为十六进制字符数组:`public static char[] encodeHex(byte[] data)` 该方法将字节数组转换为十六进制字符数组。该方法可以将字节数组转换为小写或大写的十六进制字符数组,可以根据需要选择。 ...
title: Java字节字符转换流Java字节字符转换流转换流的用法//字节流InputStream in = System.in;//写入文件中//换行//
在Java编程语言中,字节数组(byte array)和基本数据类型如int之间的转换是常见的操作,特别是在处理网络通信、文件存储或者序列化时。本篇内容将详细讲解如何在Java中进行这两种类型的转化。 首先,我们来看如何...
用于TXT文本文档存储的16进制文件的高低字节的转换以及数据校验
"Java整型数与网络字节序byte[]数组转换关系详解" 本文主要介绍了Java整型数与网络字节序byte[]数组之间的转换关系,包括整型数到byte[]数组的转换和byte[]数组到整型数的转换。这些转换关系在Java和C/C++之间的...
java中字节的各级单位相互转换的公用方法的公用类
java实现视频转换器,很大很强大的视频转换器。奉献给大家
字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流...