1

我正在使用Java中的以下代码编写文件的简短内容:

RandomAccessFile file = new RandomAccessFile("C:\\Users\\PC\\Desktop\\myFile.bin", "rw");
file.writeShort(11734);
file.close();

当我用 Java 读回它时,我得到了相同的 (11734) 号码。但是,当我使用以下代码读取C#中的数字时:

string p = "C:\\Users\\PC\\Desktop\\myFile.bin";
short s = new BinaryReader(File.OpenRead(p)).ReadInt16();

变量s包含-10707

这怎么会发生,有没有办法用 C# 检索我在 Java 中写入文件的数字?

4

5 回答 5

3

BigEndian/LittleEndian 问题。见下文

byte[] b = BitConverter.GetBytes((short)11734);
var s = BitConverter.ToInt16(new byte[] {b[1],b[0] }, 0);

s 将是 -10707

您可以使用IPAddress.HostToNetworkOrder从一种形式转换为另一种形式。

var sh1 = IPAddress.HostToNetworkOrder((short)11734); //-10707
var sh2 = IPAddress.HostToNetworkOrder((short)-10707); //11734

您还可以创建自己的 BinaryReader

public class MyBinaryReader : BinaryReader
{
    public MyBinaryReader(Stream s)  : base(s)
    {
    }

    public override short ReadInt16()
    {
        return IPAddress.HostToNetworkOrder(base.ReadInt16());
    }
}
于 2012-08-18T08:55:46.397 回答
2

正如其他人所说,这是一个字节顺序问题。

我的MiscUtil库包括EndianBinaryReaderEndianBitConverter允许您使用熟悉的 API,但可以灵活地指定字节顺序:

using System;
using System.IO;
using MiscUtil.Conversion;
using MiscUtil.IO;

static class Test
{
    static void Main()
    {
        using (var stream = File.OpenRead("myfile.bin"))
        {
            var converter = new BigEndianBitConverter();
            var reader = new EndianBinaryReader(converter, stream);
            Console.WriteLine(reader.ReadInt16());
        }
    } 
}
于 2012-08-18T09:00:13.917 回答
1

请注意,在 Java 中,您还可以选择使用ByteBuffer.allocate(size).order(LITTLE_ENDIAN).asShortBuffer().

于 2012-08-18T10:57:44.613 回答
0

你的字节顺序是错误的

 11734 = 2DD6
-10707 = D62D

http://en.wikipedia.org/wiki/Endianness

于 2012-08-18T08:55:55.583 回答
0

Java 在写出 short、int 和 long 时总是使用网络顺序(又名 big-endian)。我的猜测是 C# 读取它是小端的。

于 2012-08-18T08:56:35.533 回答