c*******a 发帖数: 29 | 1 用java读一个binary的文件,
float是安word(2 byte??)存在文件上的,
可那个DataInputStream 里面的readFloat是要读
4个byte,
现在怎么样读一个word的binary文件,把它转成float啊? |
c***r 发帖数: 4631 | 2
32位系统的word是4个byte吧?
【在 c*******a 的大作中提到】 : 用java读一个binary的文件, : float是安word(2 byte??)存在文件上的, : 可那个DataInputStream 里面的readFloat是要读 : 4个byte, : 现在怎么样读一个word的binary文件,把它转成float啊?
|
c*******a 发帖数: 29 | 3 但是转换出来不对,
估计应该是很老的2 byte
【在 c***r 的大作中提到】 : : 32位系统的word是4个byte吧?
|
c***r 发帖数: 4631 | 4
但是float在16位的机器上也是32位的,如果原来的文件使用了自己的编码方式恐怕要联
系原来生成文件的人了。
【在 c*******a 的大作中提到】 : 但是转换出来不对, : 估计应该是很老的2 byte
|
c*******a 发帖数: 29 | 5 数据虽然是float,
但是manual上说这占一个word的空间,
不知道这是指几个byte?
【在 c***r 的大作中提到】 : : 但是float在16位的机器上也是32位的,如果原来的文件使用了自己的编码方式恐怕要联 : 系原来生成文件的人了。
|
c***r 发帖数: 4631 | 6 float是有IEEE标准的,应该是32位,4 byte。
http://en.wikipedia.org/wiki/IEEE_floating-point_standard
要联
【在 c*******a 的大作中提到】 : 数据虽然是float, : 但是manual上说这占一个word的空间, : 不知道这是指几个byte?
|
c*******a 发帖数: 29 | 7 谢谢!
Java读写感觉还是比较麻烦啊,
不象c那样简明,
要生成好几个instance,层层嵌套才能开始读写。
【在 c***r 的大作中提到】 : float是有IEEE标准的,应该是32位,4 byte。 : http://en.wikipedia.org/wiki/IEEE_floating-point_standard : : 要联
|
e***g 发帖数: 158 | 8 read bytes by bytes, and reassembly the number by yourself.
don't complain - if the file is generated by java, your C code
doesn't work either.
【在 c*******a 的大作中提到】 : 用java读一个binary的文件, : float是安word(2 byte??)存在文件上的, : 可那个DataInputStream 里面的readFloat是要读 : 4个byte, : 现在怎么样读一个word的binary文件,把它转成float啊?
|
c***r 发帖数: 4631 | 9 The problem maybe "endian", java use "big-endian" and C on intel CPU will use
"little endian". So the data is confusing. And you may use code below to solve
this problem
float readFloatLittleEndian( )
{
int accum = 0;
for ( int shiftBy = 0; shiftBy < 32; shiftBy+ =8 )
{
accum |= (readByte () & 0xff) << shiftBy;
} return Float.intBitsToFloat (accum);
}
I got it from http://mindprod.com/jglo
【在 c*******a 的大作中提到】 : 谢谢! : Java读写感觉还是比较麻烦啊, : 不象c那样简明, : 要生成好几个instance,层层嵌套才能开始读写。
|
c*******a 发帖数: 29 | 10 非常感谢!
应该是endian的问题,用c来读是没有问题的,
java会读出异常大或者异常小的问题。
机子是linux intel xeon,是little endian的。
估计原来的人用c,所以根本没有考虑endian的问题。
【在 c***r 的大作中提到】 : The problem maybe "endian", java use "big-endian" and C on intel CPU will use : "little endian". So the data is confusing. And you may use code below to solve : this problem : float readFloatLittleEndian( ) : { : int accum = 0; : for ( int shiftBy = 0; shiftBy < 32; shiftBy+ =8 ) : { : accum |= (readByte () & 0xff) << shiftBy; : } return Float.intBitsToFloat (accum);
|
e***g 发帖数: 158 | 11 that's not a fair comment on the file author.
【在 c*******a 的大作中提到】 : 非常感谢! : 应该是endian的问题,用c来读是没有问题的, : java会读出异常大或者异常小的问题。 : 机子是linux intel xeon,是little endian的。 : 估计原来的人用c,所以根本没有考虑endian的问题。
|
c*******a 发帖数: 29 | 12 写读程序的人用java,也没有考虑了endian
要真想移植性好,就得用ascii吧。
其实应该每个数字文件都来个头文件什么的,
一读系统就知道是big还是little了。
【在 e***g 的大作中提到】 : that's not a fair comment on the file author.
|
c***r 发帖数: 4631 | 13 so here comes xml.
【在 c*******a 的大作中提到】 : 写读程序的人用java,也没有考虑了endian : 要真想移植性好,就得用ascii吧。 : 其实应该每个数字文件都来个头文件什么的, : 一读系统就知道是big还是little了。
|