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が含まれています。

これはどのように起こりますか?また、Java、C# でファイルに書き込んだ番号を取得する方法はありますか?

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ライブラリにはEndianBinaryReaderとが含まれておりEndianBitConverter、使い慣れた 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/エンディアンネス

于 2012-08-18T08:55:55.583 に答える
0

Java は、short、int、および long を書き出すときに、常にネットワーク順序 (別名ビッグエンディアン) を使用します。私の推測では、C# はそれをリトルエンディアンで読み取ります。

于 2012-08-18T08:56:35.533 に答える