2進数配列の保存

解決


風邪  2004-04-21 04:15:15  No: 8485  IP: [192.*.*.*]

論理型のはいれつをファイルに保存する際、
文字列型に0と1で記していましたが、
文字列型では255進数なので無駄なような気がしました
良い方法は有りますか?

編集    削除
にしの  2004-04-21 04:58:24  No: 8486  IP: [192.*.*.*]

ビットごとに保存すればよろしいのでは?
要素8個分を1バイトとして保存し、最後に端数が出る場合には最大7ビットのダミーデータを入れて保存します。
要素数が不定であれば、先頭に配列数を書いておけば、ダミーを追加しても問題ありません。

編集    削除
風邪  2004-04-21 05:09:07  No: 8487  IP: [192.*.*.*]

難しいです
配列の要素の数は決まってます

編集    削除
風邪  2004-04-21 05:22:36  No: 8488  IP: [192.*.*.*]

とりあえずTBits調べてみます

編集    削除
jok  2004-04-21 05:23:19  No: 8489  IP: [192.*.*.*]

無駄というか、Boolean 型の変数は1バイトなので、サイズは
'0' と '1' の文字にしても同じですが、書き込み・読み出しの
効率は悪いですね。配列そのものをメモリーストリームをつかって
読み書きすると簡単です。

procedure TForm1.Button1Click(Sender: TObject);
var
  bl:array[0..9] of Boolean;
  i:integer;
  ms:TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    for i := 0 to 9 do bl[i] := Odd(i);
    ms.Write(bl,SizeOf(Boolean)*10);
    ms.SaveToFile('c:\Bool.bin');
  finally
    ms.Free;
  end;
end;

これは書き込みの例です。読み出しは

procedure TForm1.Button2Click(Sender: TObject);
var
  bl:array[0..9] of Boolean;
  i:integer;
  ms:TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile('c:\Bool.bin');
    ms.Read(bl,SizeOf(Boolean)*10);
    for i := 0 to 9 do
     if bl[i] then
       Memo1.Lines.Add('odd')
     else
       Memo1.Lines.Add('even');
  finally
    ms.Free;
  end;
end;

のようにします。

編集    削除
風邪  2004-04-21 05:26:11  No: 8490  IP: [192.*.*.*]

Thank You.

編集    削除