繁体   English   中英

写Java ObjectOutputStream.writeInt()用BinaryReader在C#中读取?

[英]Write Java ObjectOutputStream.writeInt() read with BinaryReader in C#?

好的,所以我有一个用Java编程的游戏地图创建器,它使用ObjectOutputStream.writeInt()将地图写到文件中。

现在,我将游戏引擎转换为C#XNA,并尝试加载地图。 我虽然遇到数字错误,但我想知道是否有人知道我在做什么错?

我相信Java写成int 32 Big Endian(不过我可能错了)。

这是我用来读取C#地图高度和宽度的代码。

编辑:br是BinaryReader。

width = (int)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(br.ReadBytes(sizeof(int)), 0));
height = (int)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(br.ReadBytes(sizeof(int)), 0));

谁能告诉我我做错了什么? 或者如何在C#中正确地从ObjectOutputStream.writeInt()读取字节?

编辑:第二次尝试失败。 这是当前代码:

public byte[] ReadBigEndianBytes(int count, BinaryReader br)
        {
            byte[] bytes = new byte[count];
            for (int i = count - 1; i >= 0; i--)
                bytes[i] = br.ReadByte();

            return bytes;
        }

        public void loadFile(int level)
        {
            FileStream fs = new FileStream("map" + level + ".lv", FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs, System.Text.Encoding.BigEndianUnicode);

            width =  BitConverter.ToInt32(ReadBigEndianBytes(4, br), 0);
            height = BitConverter.ToInt32(ReadBigEndianBytes(4, br), 0);

            tile = new int[width, height];

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    tile[x, y] = BitConverter.ToInt32(ReadBigEndianBytes(4, br), 0);
                }
            }

        }
    }
ObjectOutputStream.writeInt()

不要使用它。 使用DataOutputStream.writeInt()。 它以网络字节顺序执行相同的操作,但是它没有添加ObjectOutputStream添加的Serialziation头,因此您不必在.NET端跳过它。

完全正确:

我相信Java写成int 32 Big Endian(不过我可能错了)。

不过请记住:.Net Int32是Little-Endian;)

[编辑]解决方案:

1)这是写10个整数的Java代码(Java int是32位的Big-endian)


    import java.io.*;

    public class WriteBinary {

      public static void main (String[] args) {
        int[] data = {
          1, 2, 3, 4, 5, 6, 7, 8, 9, 10
        };

        String fname = "myfile.bin";
        try
        {
          System.out.println("Opening " + fname + "...");      
          FileOutputStream fos = 
            new FileOutputStream(fname);
          int ibyte;
          for (int i = 0; i < data.length; i++) {
            ibyte = ((data[i] >>> 24) & 0xff); fos.write(ibyte);
            ibyte = ((data[i] >>> 16) & 0xff); fos.write(ibyte);
            ibyte = ((data[i] >>> 8) & 0xff); fos.write(ibyte);
            ibyte = (data[i] & 0xff); fos.write(ibyte);
          }
          fos.close();
          System.out.println("File write complete.");      
        }
        catch (IOException e) {
          System.out.println ("I/O error: " + e.getMessage());
        }
      }
    }

2)这是读取它的C#代码。 您会注意到“正在使用System.Net”,以便获得等效于“ ntohl()”的.Net:



using System;
using System.IO;
using System.Net;

namespace ReadBinary
{
    class Program
    {
        static void Main(string[] args)
        {
            string fname = "myfile.bin";
            try
            {
                Console.WriteLine("Opening " + fname + "...");
                BinaryReader br =
                  new BinaryReader(
                        File.Open(fname, FileMode.Open));
                for (int i = 0; i < (int)(br.BaseStream.Length / 4); i++)
                {
                    int j =
                        System.Net.IPAddress.NetworkToHostOrder (br.ReadInt32());
                    Console.WriteLine("array[" + i + "]=" + j + "...");
                }
                br.Close();
                Console.WriteLine("Read complete.");
            }
            catch (IOException ex)
            {
                Console.WriteLine("I/O error" + ex.Message);
            }
        }
    }
}

我认为正确的方法是使用IPAddress.NetworkToHostOrder(Int32)方法。

public void loadFile(int level)
    {
        ...

        width =  IPAddress.NetworkToHostOrder(br.ReadInt32());
        height = IPAddress.NetworkToHostOrder(br.ReadInt32());

        ...

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM