独自のファイル形式を定義するには?


ドープ  2005-11-16 05:04:57  No: 18724

いまソフトを開発しているのですが、そのソフトの設定を保存するときテキストファイルで保存するのは嫌なので、どうにかして、読めないファイルで保存したいのですが、それは無理なのでしょうか?


りおりお  2005-11-16 05:15:58  No: 18725

アプリをつくってるのはあなたですから、いかようにもフォーマットを定義できます。

たとえば、単純にテキストをそのままセーブすると外部からエディタで読まれてし
まいますが、何かと xor をとる単純な暗号化でもかなり読みづらくするのは簡単
です。


りおりお  2005-11-16 08:46:25  No: 18726

例をあげておきます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    txt: string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  key: array[0..4] of byte =($EA, $74, $3D, $96, $3F); // 適当

procedure TForm1.FormCreate(Sender: TObject);
begin
  txt := 'たとえば、単純にテキストをそのままセーブすると外部からエディタ'+
         'で読まれてしまいますが、何かと xor をとる単純な暗号化でもかなり'+
         '読みづらくするのは簡単です。'
end;

// そのままテキストで保存する
procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    ms.Write(txt[1], Length(txt));
    ms.SaveToFile('c:\test.aaa');
  finally
    ms.Free;
  end;
end;

// 暗号化して書き込む− テキストエディタでは読めない
procedure TForm1.Button2Click(Sender: TObject);
var
  ms: TMemoryStream;
  p: PByte;
  i: integer;
begin
  ms := TMemoryStream.Create;
  try
    ms.Write(txt[1], Length(txt));
    p := ms.Memory;
    for i := 0 to Length(txt)-1 do
    begin
      p^ := p^ xor key[i mod 5];  // 暗号化
      inc(p);
    end;
    ms.SaveToFile('c:\test.xxx');
  finally
    ms.Free;
  end;
end;

// 暗号化したファイルを読んで復号して表示
procedure TForm1.Button3Click(Sender: TObject);
var
  ms: TMemoryStream;
  p: PByte;
  i: integer;
  s: string;
begin
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile('c:\test.xxx');
    p := ms.Memory;
    for i := 0 to Length(txt)-1 do
    begin
      p^ := p^ xor key[i mod 5];  // 復号化
      inc(p);
    end;
    SetLength(s,ms.Size);
    ms.Read(s[1], ms.Size);
    Memo1.Text := s;
  finally
    ms.Free;
  end;
end;

end.


りおりお  2005-11-16 08:51:02  No: 18727

すみません、訂正です。

procedure TForm1.Button3Click(Sender: TObject);

for i := 0 to Length(txt)-1 do

のところを

for i := 0 to ms.Size-1 do

としてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加