文字列をバイナリ形式でファイルに保存し、
それを読み込んでメモコンポーネントなどに文字列として表示することは可能でしょうか?
TMemoryStreamを使って色々やってみましたが、上手くいきませんでした。(表示の際に崩れてしまいます・・・)
要は、文字列を保存したファイルをメモ帳などのテキストエディターで開いた時に解読不能であれば目的は達成できるのですが。
どなたか教えていただければ幸いです。
お願いいたします。
(Win98SE Delphi5pro)
こういうことでしょうか。
単純に、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;
説明が不十分ですいません。
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)」と表示させることは
できるのでしょうか。色々やってみましたが、どうしてもエラーが出たり、
関係ない文字列が表示されたりしてしまいます。
上記のコードも正しい書き方では無いような気がするので、
解決法と合わせて御教授いただけたら幸いです。
いくつか勘違いがあるようですが…(^^ゞ
書かれているサンプルコードでは10個の文字列は保存できません。
◆SizeOf(string)の値は4です。(ポインタの格納サイズ)
◆iarrアドレス以降に格納されているのは、文字列ではなくて文字列のポインタです。
◆string(長い文字列)の配列ではなくてstring[n](短い文字列)の配列ならば、文字列そのもの(文字列の長さデータも含む)が先頭アドレスから順に格納されます。
◆たとえバイナリ形式で文字列を保存しても、エディタで見えてしまいます。
したがって、文字列をエディタで見られないように保存するには、文字コードを加工して保存し、読込む時に元に戻すようにする必要があります。
「Delphian World」に暗号化保存のコンポーネントがあるので、それを利用すればいいでしょう。
何にもわかっていなかったようです。(O_O;;;
暗号化保存のコンポーネントで目的は達成できそうです。
妙な質問への丁寧なレスをどうもありがとうございました。
精進します...
ツイート | ![]() |