[英]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.