首页 新闻 会员 周边 捐助

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

0
悬赏园豆:30 [已解决问题] 解决于 2016-02-27 10:32

目前已定位到是因为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二进制格式。

 

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

李晓晖的主页 李晓晖 | 初学一级 | 园豆:175
提问于:2016-02-26 17:26
< >
分享
最佳答案
0
public static sbyte[] ToJavaBytes(byte[] bytes)
        {
            int len = bytes.Length;
            sbyte[] sbs = new sbyte[len];
            for (int i = 0; i < len; i++)
            {
                var b = bytes[i];
                if (b > 127)
                {
                    sbs[len - 1 - i] = (sbyte)(b - 256);
                }
                else
                {
                    sbs[len - 1 - i] = (sbyte)b;
                }
            }
            return sbs;
        }

 

收获园豆:30
jello chen | 大侠五级 |园豆:7336 | 2016-02-26 19:27

非常感谢,确实java中说明了:writes that long value to the underlying output stream as an 8-byte quantity, high byte first

 

根据您的信息,以彻底解决,非常感谢。

李晓晖 | 园豆:175 (初学一级) | 2016-02-27 10:31
其他回答(1)
0

虽然看不懂你在说什么,但是早晚有一天我能帮你解决。谢谢骗系统呢

汇编学者 | 园豆:202 (菜鸟二级) | 2016-02-26 17:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册