将字符串转换为字节数组然后写入bin文件

convert string to array of byte then write to bin file

您好,我想将字符串转换为字节数组,然后以十六进制格式将位置处的字节保存到 bin 文件中

当我使用十六进制编辑器打开二进制文件并搜索所选位置时,有一个日期示例 21-01-2020,因此我想将其替换为今天的日期。通过 TEdit.Text 或通过 TDateTimePicker 或 returns 到当前系统日期并直接写入所选偏移所需值的函数。

我正在使用已在 Whosebug 中找到的这段代码,但它只写了一个字符 例如,我想将 edit1.text 的日期写入位置 x

的 bin 文件

这是代码:

procedure TForm7.Button1Click(Sender: TObject);
   var
  fs: TFileStream;
  Buff: array of byte;
   begin

    // Set length of buffer and initialize buffer to zeros
       SetLength(Buff, 10);
      FillChar(Buff[0], Length(Buff), #0); // this will write 0 to 10 bytes 
    fs := TFileStream.Create('F:\test\file.bin', fmOpenWrite);
   try
   fs.Position := c20;                 // Set to starting point of write
   fs.Write(Buff[0], Length(Buff));   // Write bytes to file
   finally
  fs.Free;
  end;
end;

我会根据描述尽可能地解释它,而不考虑提供的代码,因为它缺少关键信息。

将字符串转换为字节数组:

byteArray := TEncoding.UTF8.GetBytes('some string');

将字节数组插入到具有偏移量的文件中:

fileStream := System.IO.FileStream.Create('F:\test\file.bin', FileMode.OpenOrCreate);
fileStream.Seek(c20, SeekOrigin.Begin);
fileStream.Write(byteArray,0,Length(byteArray));
fileStream.Close;

不需要转换!只写字符串,根据你的评论,你必须写ansi字符串(每个字符一个字节)。对于日期,简单转换为 AnsiString 就足够了。编译器会发出警告,因为对于重音字符或中文等,强制转换无法按预期工作。我使用了编译器指令来关闭该警告。

我没有更多 Delphi 10.1,但下面的代码应该适用于那个旧编译器。

procedure TForm1.Button1Click(Sender: TObject);
var
    Buffer     : AnsiString;
    FileName   : String;
    FileStream : TFileStream;
begin
    {$WARN IMPLICIT_STRING_CAST_LOSS OFF}
    Buffer     := String(FormatDateTime('MM-DD-YYYY', Now));
    FileName   := 'E:\Temp\file.bin';
    if not FileExists(FileName) then begin
        ShowMessage('File not found: "' + FileName + '"');
        Exit;
    end;

    FileStream := TFileStream.Create(FileName, fmOpenReadWrite);
    try
        FileStream.Seek(c20, soBeginning);
        FileStream.Write(Buffer[1], Length(Buffer));
    finally
        FileStream.Free;
    end;
end;