1

我正在使用 Delphi Prism 并使用 BinaryWriter 创建和写入二进制文件,如下所示。

method TUnit.Write(bw:BinaryWriter);
var
    i:Integer;
begin
    bw.write(ord(uType));
    bw.Write(ord(State));
    bw.Write(Address);
    bw.Write(SubAddress);

    for i:=1 to 20 do
        bw.Write(fDefs[i]);
end;

我对你的问题是这个。write 方法是否在没有换行符或回车的情况下每行或字节后的字节或字符后的字节写入?

我问这个问题的原因是因为在没有特定数量的字符(如字符数组)的情况下写入和读取字符串时我很困惑。

例如:

method WritetoFile;
var
    x:integer;
    thestr:string;
begin
    BinaryWriter thefile := new BinaryWriter(File.Create("test.dat"));
    thefile.write(thestr);
    thefile.write(x);
    thefile.Close;
end;

method ReadFromFile;
var
   x:integer;
   thestr:string;
begin
   BinaryReader thefile := new BinaryReader(File.OpenRead("test.dat"));
   thestr:=thefile.ReadString;
   x:=thefile.ReadInt32;
   thefile.Close;
end;

这就是我编写程序的方式,它似乎工作正常,但正如我所说,我很困惑。

当它是字符串数据类型时,它如何知道要读取或写入多少字节或字符长度而不给它特定的读取长度?

4

2 回答 2

4

BinaryWriter“Write 方法”是否与 Delphi 的 Writeln 方法一样工作?

不,不是的。

当它是字符串数据类型时,它如何知道要读取或写入多少字节或字符长度而不给它特定的读取长度?

在许多方面,您并不需要知道如何BinaryWriter以及如何BinaryReader去做。您正在正确使用它。您只需要将每个呼叫与适当类型Write()的匹配呼叫配对。ReadXXX()

文档确实描述了底层二进制文件格式。您不需要写入或读取字符串的长度,因为 Binary I/O 类会完全代表您执行此操作。

以长度为前缀的字符串通过在字符串前面加上一个包含该字符串长度的单个字节或单词来表示字符串长度。此方法首先将字符串的长度写入为 UTF-7 编码的无符号整数,然后使用 BinaryWriter 实例的当前编码将那么多字符写入流。

因此,您可以安全地编写一个包含换行符的字符串,并且在读取时这些换行符将被保留。

于 2011-09-09T13:31:49.170 回答
2

不,不是的。您想为此使用 StreamWriter,它具有可以执行所需操作的 WriteLine 和 Write 方法。binaryReader/Writer 类使用前缀整数作为长度,然后写入数据。

于 2011-09-09T13:31:04.927 回答