【问题标题】:Delphi Prism: Does BinaryWriter "Write method" work the same as Writeln method from Delphi?Delphi Prism:BinaryWriter“Write 方法”是否与 Delphi 的 Writeln 方法一样工作?
【发布时间】:2011-09-09 13:10:38
【问题描述】:

我正在使用 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;

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

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

【问题讨论】:

    标签: .net delphi delphi-prism binaryreader binarywriter


    【解决方案1】:

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

    不,它没有。

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

    在很多方面你并不需要知道BinaryWriterBinaryReader 是如何做到的。您正在正确使用它。您只需将每个 Write() 调用与相应类型的匹配 ReadXXX() 调用配对。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 实际上,在我看来,@digitalanalog 想要的更像是 BinaryWriter 而不是文本编写器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      相关资源
      最近更新 更多