在C,C ++中,如果您以二进制方式写一个整数(例如fwrite(&someInt,sizeof(int),1,fp)
)对文件说,如果您想从其他机器读取该整数,则要考虑很多问题-例如,字节序问题,整数大小可能会有所不同。在其他计算机上,浮点表示形式可能在不同的计算机上有所不同,负整数具有不同的表示形式,等等。因此,直接在二进制模式下进行读写可能无法在不同的计算机上工作。
在下面的使用Binary reader(来自MSDN)的示例中,上述问题也适用吗?
using System;
using System.IO;
class ConsoleApplication
{
const string fileName = "AppSettings.dat";
static void Main()
{
WriteDefaultValues();
DisplayValues();
}
public static void WriteDefaultValues()
{
using (BinaryWriter writer = new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
writer.Write(1.250F);
writer.Write(@"c:\Temp");
writer.Write(10);
writer.Write(true);
}
}
public static void DisplayValues()
{
float aspectRatio;
string tempDirectory;
int autoSaveTime;
bool showStatusBar;
if (File.Exists(fileName))
{
using (BinaryReader reader = new BinaryReader(File.Open(fileName, FileMode.Open)))
{
aspectRatio = reader.ReadSingle();
tempDirectory = reader.ReadString();
autoSaveTime = reader.ReadInt32();
showStatusBar = reader.ReadBoolean();
}
Console.WriteLine("Aspect ratio set to: " + aspectRatio);
Console.WriteLine("Temp directory is: " + tempDirectory);
Console.WriteLine("Auto save time set to: " + autoSaveTime);
Console.WriteLine("Show status bar: " + showStatusBar);
}
}
}
那
BinaryFormatter
类呢? 最佳答案
BinaryWriter的字节序是固定的。它总是小尾数。
每种数据类型的整数大小始终相同:byte/sbyte 1B
short/ushort 2B
int/uint 4B
long/ulong 8B
浮标和双打遵循IEEE标准
用BinaryReader/BinaryWriter
进行读取和写入将带来相同的结果。从C#到Java,您需要翻转所有传入的字节,因为Java使用的是BigEndianBinaryFormatter
用于在同一台PC上序列化或反序列化对象。将数据从一台PC传输到另一台PC时,不应使用它。
如果使用两个C#应用程序,只需使用BinaryReader/BinaryWriter
,它们就可以移植。如果另一端未使用C#编程,则很可能需要使用(或编写自己的)类来处理此类问题。