文字列をバイナリ形式で読み書きするには?

解決


メロス  2001-09-09 22:55:36  No: 158

文字列をバイナリ形式でファイルに保存し、
それを読み込んでメモコンポーネントなどに文字列として表示することは可能でしょうか?
TMemoryStreamを使って色々やってみましたが、上手くいきませんでした。(表示の際に崩れてしまいます・・・)

要は、文字列を保存したファイルをメモ帳などのテキストエディターで開いた時に解読不能であれば目的は達成できるのですが。
どなたか教えていただければ幸いです。
お願いいたします。
(Win98SE Delphi5pro)


にしの  2001-09-22 02:16:15  No: 159

こういうことでしょうか。
単純に、Memo.Lines.SaveToFileやらSaveToStreamやらでも同じ気がしますが。

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
  strTemp: String;
begin
  fs := TFileStream.Create('D:\test.txt', fmCreate);

  strTemp := Memo1.Lines.Text;
  fs.WriteBuffer(Pointer(strTemp)^, Length(strTemp));
  fs.Free;
end;


メロス  2001-09-22 10:20:40  No: 160

説明が不十分ですいません。
var
        i: Integer;
        iarr: array [0..9]of string;
        F:textFile;
        Stream: TMemoryStream;
begin
        for i:=0 to 9 do begin
                iarr[i]:='文字列です';
        end;

        Stream:= TMemoryStream.Create;
        try
                Stream.Write(iarr,10*SizeOf(string));
                Stream.saveToFile('D:\test.txt');
        finally
                Stream.Free;
        end;
end;
とすると、test.txtに50字の文字列が保存されますが、
これをテキストエディタで開いても、意味不明の半角文字で読めません。
メモ帳で開いた時に読めると都合が悪いので、あえてこのようにしたいのですが、
これをプログラム側で読み込んで再び「文字列です(X10)」と表示させることは
できるのでしょうか。色々やってみましたが、どうしてもエラーが出たり、
関係ない文字列が表示されたりしてしまいます。
上記のコードも正しい書き方では無いような気がするので、
解決法と合わせて御教授いただけたら幸いです。


ホップ  2001-09-22 17:56:25  No: 161

いくつか勘違いがあるようですが…(^^ゞ
書かれているサンプルコードでは10個の文字列は保存できません。

◆SizeOf(string)の値は4です。(ポインタの格納サイズ)
◆iarrアドレス以降に格納されているのは、文字列ではなくて文字列のポインタです。
◆string(長い文字列)の配列ではなくてstring[n](短い文字列)の配列ならば、文字列そのもの(文字列の長さデータも含む)が先頭アドレスから順に格納されます。
◆たとえバイナリ形式で文字列を保存しても、エディタで見えてしまいます。

したがって、文字列をエディタで見られないように保存するには、文字コードを加工して保存し、読込む時に元に戻すようにする必要があります。
「Delphian World」に暗号化保存のコンポーネントがあるので、それを利用すればいいでしょう。


メロス  2001-09-23 03:16:28  No: 162

何にもわかっていなかったようです。(O_O;;;
暗号化保存のコンポーネントで目的は達成できそうです。
妙な質問への丁寧なレスをどうもありがとうございました。
精進します...


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








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