我正在用 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 写入文件的数字?
最佳答案
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());
}
}
关于c# - C# 中的 ReadInt16 返回的内容与 Java 中的 writeShort 所写的不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12017244/