Java中的Big-Little问题的一种解决方法

近期学JAVA的IO,想练习一下,于是找来一个BMP文件,做练习使用。但是程序第一次运行就出了问题,分配空间的时候出错,后来查了一下,发现读取的文件大小不对,再后来发现,连读入的头两个字符"BM"都不对,设置断点查了一下,原来是用的RandomAccessFile类的readShort,读取的2个字节顺序不一样。从网上搜了一下,发现时Big-Endian和Little-Endian的问题。下面的是网上查到的一些介绍:

 

Java二进制文件中的所有东西都以big-endian形式存在,高字节优先,这有时被称为网络顺序。这是一个好的消息,意味着如果你只使用 Java。所有文件在所有平台(Mac,PC,Solaris等)上按同样的方式进行处理。可以自由地交换二进制数据,以电子形式在Internet上, 或在软盘上,而无需考虑endian问题。存在的问题是当你与那些不是使用Java编写的程序交换数据文件时,会存在一些问题。因为这些程序使用的是 little-endian顺序,通常是在PC上使用的C语言。有些平台内部使用big-endian字节顺序(Mac,IBM390);有些平台使用 little-endian字节顺序(Intel)。Java对用户隐瞒了endian问题。


解决方式可以采用:

  • 重写提供输入文件的输出程序。它可以直接输出big-endian字节流DataOutputStream或者字符DataOutputSream格式。
  • 写一个独立的翻译程序,读和排列字节。可以用任何语言编写。
  • 以字节形式读数据,并重新安排它们
  • 还有一种方式是自己编写函数进行数据格式的转化。

打开RandomAccessFile的源代码,发现数据处理的代码如下:

 

 

 

 

简单明了,一目了然,因此重写输入输出程序是最简单的方法。由于这里的readShort是final的,因此采用由RandomAccessFile派生的方法,建立的新类如下:

 

 

 

 

就是把原来的代码拷贝出来,然后把移位的变量换一下,就能轻松搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值