2 oncenaked oncenaked 于 2016.02.26 17:47 提问

C#中将double值变成二进制然后写入文件,Java中载入该文件读取此二进制double值时不正确 1C

目前已定位到是因为C#中的byte范围是0到255,而java中byte值为-128到127导致的错误。

尝试过使用C#的sbyte来解决:

bw1 = new BinaryWriter(new FileStream("C:\Users\DELL\Desktop\SpatialIndex\ctest1.bin", FileMode.Create));
bw2 = new BinaryWriter(new FileStream("C:\Users\DELL\Desktop\SpatialIndex\ctest2.bin", FileMode.Create));

byte[] bits=BitConverter.GetBytes(501751.060001268);//测试数据
sbyte[] bitsb = new sbyte[8];
for (int i = 0; i < bits.Length; i++)
{
byte abyte = bits[i];
if (abyte > 127)
{
bitsb[i] = (sbyte)(abyte - 256);
}
else
{
bitsb[i] = (sbyte)abyte;
}
bw1.Write(bitsb[i]);
bw2.Write(bits[i]);
}

但是写入后对比,两个文件中的内容还是一样,并没有生成为java二进制格式。

不知道有哪位高人也遇到并解决过类似问题。

2个回答

caozhy
caozhy   Ds   Rxr 2016.02.26 17:59

已定位到是因为C#中的byte范围是0到255,而java中byte值为-128到127导致的错误。
不是这个问题。

byte无所谓符号不符号。
关键是java的double和C#的是否兼容,java是大端序还是小端序。

oncenaked
oncenaked 问题已解决,两个问题:一个是要将C#中的byte通过位移变为符合javabyte规则的sbyte,其次,java中的double为大端序,byte排列顺序得改变。
2 年多之前 回复
oncenaked
oncenaked   2016.02.27 10:41

问题已解决,两个问题:
一个是要将C#中的byte通过位移变为符合javabyte规则的sbyte
其次,java中的double为大端序,byte排列顺序得改变。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
将double类型的数据写入二进制文件,从二进制文件中读取double类型数据
这是C的代码  //写入二进制文件   FILE *f=fopen("F:\\g.txt","wb+"); double d=123456123.1231231131; fwrite(&d,sizeof(double),1,f); fclose(f); //从二进制文件读出 FILE *fop=fopen("F:\\g.txt","rb"); dou
C#读取二进制文件【float型】
今天需要用C#读取二进制文件,文件里面存储的全是float类型的小数。 由于接口比较隐蔽,所以就记录一下。 FileStream fs; fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Read); BinaryReader br = ne
Java把double数据写入文件中
public class ReadOrWriteObject { private FileInputStream fileIns = null ;//文件输入流 private FileOutputStream fileOts = null;//文件输出流 private ObjectInputStream objectIns = null ;//对象输入流 private Obj
float和double的数值怎么保存在二进制中
稍微浅学过二进制的人,都清楚二进制是个什么东西。我们都了解正整数是怎么转化成二进制的,那么计算机中,又是怎么保存folat,double类型的数值的呢? 要像弄清楚这个问题,首先得清楚二进制是怎么表示小数的。(这一点请注意了) 十进制是怎么表示小数的呢? 比如,125.456     其实可以分解成 1*10^2+2*10^1+5*10^0+4*10^-1+5*10^-2+6*10^-3
Java读写二进制文件到String,再写入二进制文件
概述java读写文件的有很多种方式,基本都是采用java.io的inputStream和各种基于inputstream的封装实现对文件的读写,最原始的接口提供的便是基于byte的读写,而String可以看做是char[],一个char是8个byte。在最原始的ASCII编码中,我们采用一个字节 也就时8位来表示一个字符(图形字符或者控制字符),而后来1个字节不足以表示现实中的所有字符,于是出现了各种
利用IO流进行基本类型同二进制的转换,以double为例
package convert; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; public class
C++:读写二进制文件到double数组
在以下的代码中,我们将写入一个double数组到1.txt中,并且读取出来。 主要采用了fstream这个库,代码如下: #include #include #include int main(){ const int length = 100; double f1[length] ; for (int i = 0; i < length; i++)
C/C++读取二进制文件中的float、double数据
关于float和double在计算机中的存储结构这里就不赘述了,一般主要是PC机法,用补码的方式存储, 不过这个跟我们用程序读取数据的关系不大,计算机自己知道怎么读。 我的计算机与数据文件的字节序是相反的,所以需要换一下顺序。 float read_float(istream& is) { unsigned int value; is.read((char*)&value, 4);
java浮点数的二进制格式分析
float类型在计算机中占用32位其中符号位1位,阶码8位,尾数23位比如3.125f在计算机中存放为:0100 0000 0 100 1000 0000 0000 0000 0000符号:第1位:0表示正数,1表示负数;阶码:第2-9位:100 0000 0,即1000 0000为128,所以指数为128-127=1;注意计算方法中必须把从二进制得到的十进制数减127尾数:第10-32位:100
js当中想要获取一个double结果值
在js当中想要获取一个double结果值,使用下面方法:var sala = Number(document.getElementById("salary").value);var inte = Number(document.getElementById("interest").value);var stoc = Number(document.getElementById("stock").value);var secu = Number(document.getElementById("securit