Redian新闻
>
问个很简单的问题?
avatar
问个很简单的问题?# Java - 爪哇娇娃
c*a
1
用java读一个binary的文件,
float是安word(2 byte??)存在文件上的,
可那个DataInputStream 里面的readFloat是要读
4个byte,
现在怎么样读一个word的binary文件,把它转成float啊?
avatar
c*r
2

32位系统的word是4个byte吧?

【在 c*******a 的大作中提到】
: 用java读一个binary的文件,
: float是安word(2 byte??)存在文件上的,
: 可那个DataInputStream 里面的readFloat是要读
: 4个byte,
: 现在怎么样读一个word的binary文件,把它转成float啊?

avatar
c*a
3
但是转换出来不对,
估计应该是很老的2 byte

【在 c***r 的大作中提到】
:
: 32位系统的word是4个byte吧?

avatar
c*r
4

但是float在16位的机器上也是32位的,如果原来的文件使用了自己的编码方式恐怕要联
系原来生成文件的人了。

【在 c*******a 的大作中提到】
: 但是转换出来不对,
: 估计应该是很老的2 byte

avatar
c*a
5
数据虽然是float,
但是manual上说这占一个word的空间,
不知道这是指几个byte?

【在 c***r 的大作中提到】
:
: 但是float在16位的机器上也是32位的,如果原来的文件使用了自己的编码方式恐怕要联
: 系原来生成文件的人了。

avatar
c*r
6
float是有IEEE标准的,应该是32位,4 byte。
http://en.wikipedia.org/wiki/IEEE_floating-point_standard

要联

【在 c*******a 的大作中提到】
: 数据虽然是float,
: 但是manual上说这占一个word的空间,
: 不知道这是指几个byte?

avatar
c*a
7
谢谢!
Java读写感觉还是比较麻烦啊,
不象c那样简明,
要生成好几个instance,层层嵌套才能开始读写。

【在 c***r 的大作中提到】
: float是有IEEE标准的,应该是32位,4 byte。
: http://en.wikipedia.org/wiki/IEEE_floating-point_standard
:
: 要联

avatar
e*g
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啊?

avatar
c*r
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,层层嵌套才能开始读写。

avatar
c*a
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);

avatar
e*g
11
that's not a fair comment on the file author.

【在 c*******a 的大作中提到】
: 非常感谢!
: 应该是endian的问题,用c来读是没有问题的,
: java会读出异常大或者异常小的问题。
: 机子是linux intel xeon,是little endian的。
: 估计原来的人用c,所以根本没有考虑endian的问题。

avatar
c*a
12
写读程序的人用java,也没有考虑了endian
要真想移植性好,就得用ascii吧。
其实应该每个数字文件都来个头文件什么的,
一读系统就知道是big还是little了。

【在 e***g 的大作中提到】
: that's not a fair comment on the file author.
avatar
c*r
13
so here comes xml.

【在 c*******a 的大作中提到】
: 写读程序的人用java,也没有考虑了endian
: 要真想移植性好,就得用ascii吧。
: 其实应该每个数字文件都来个头文件什么的,
: 一读系统就知道是big还是little了。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。