テキストファイルをバイナリファイルに変換する方法が
分からずに困っています。
まだDELPHI初心者なので、よろしくお願いいたします。
DELPHI5を使用しています。
??
テキストファイルはバイナリファイルの一種ですけど。
どうしたいのかもうすこし説明してください。
りおりおさん、分かりづらくてごめんなさい。
例えばあるファイルに『レーザービーム』って
記述されているとします。
普通に開くとわかる文字を、分からなくしたいのです。
過去に同じ質問の仕方をした方がいらっしゃいます。
https://www.petitmonte.com/bbs/answers?question_id=49
構造体とかにしてStream等で保存すれば普通のエディタでは見れないと思います。
見ようと思えば見れるかもしれませんが。
構造体ていうか record 型にしても、文字列は個別にストリームに書き込みますので
見えますね。簡単な暗号化がよいと思います。
>構造体とかにしてStream等で保存すれば普通のエディタでは見れないと思います。
構造体にしただけではメモ帳でも見えてしまうと思うけど…
一番簡単な「暗号化」はこんな感じ。
ただし、タネが簡単なので解読される確率高し。
でもエディタでチョット見ただけでは判読できない。
もっと長いタネを使えば結構堅い暗号化も可能。
const
SEED = $AB;
FILEPATH = 'test.dat';
// 書き込み
procedure TForm1.Button1Click(Sender: TObject);
var
fs: TFileStream;
i, Len: Integer;
buf: PChar;
begin
Len := Length(Memo1.Text);
GetMem(buf, Len+1);
fs := TFileStream.Create(FILEPATH, fmCreate);
try
StrPCopy(buf, Memo1.Text);
for i:=0 to Len-1 do begin
Byte(buf[i]) := Byte(buf[i]) xor SEED;
end;
fs.Write(buf^, Len);
finally
FreeMem(buf);
fs.Free;
end;
end;
// 読み込み
procedure TForm1.Button2Click(Sender: TObject);
var
fs: TFileStream;
i, Len: Integer;
buf: PChar;
begin
fs := TFileStream.Create(FILEPATH, fmOpenRead);
Len := fs.Size;
GetMem(buf, Len+1);
try
fs.Read(buf^, Len);
buf[Len] := #0;
for i:=0 to Len-1 do begin
Byte(buf[i]) := Byte(buf[i]) xor SEED;
end;
Memo1.SetTextBuf(buf);
finally
FreeMem(buf);
fs.Free;
end;
end;
var
SaveData:TSaveData{=構造体};
F:File;
begin
SaveData.a:='aaa';
SaveData.b:='xxx';
AssignFile(F,ChangeFileExt(Application.ExeName,'.savedata'));
try
Rewrite(f,1);
BlockWrite(f,SaveData,sizeof(TSaveData));
finally
CloseFile(f);
end;
end;
という風な感じで。
どこかのサイトに載っていた方法です。
>という風な感じで
TSaveDataの定義を書いてもらえませんか?
> という風な感じで
実際に試してみましたか?
1)ちゃんと書き込めましたか?
2)メモ帳や普通のエディタでテキストが見えませんでしたか?
確認してください。
> TSaveDataの定義を書いてもらえませんか?
TtPIPICHさんのサンプルソースからある程度読み取れるような...
> 確認してください。
確認してみましたが、できましたよ。
少なくともメモ帳で開いて、aaaやxxxが直接見ることは無かったです。
ロードしてませんが...
procedure TForm1.Button1Click(Sender: TObject);
type
TSaveData = record
a: String;
b: String;
end;
var
SaveData:TSaveData{=構造体};
F:File;
begin
SaveData.a:='aaa';
SaveData.b:='xxx';
AssignFile(F,ChangeFileExt(Application.ExeName,'.savedata'));
try
Rewrite(f,1);
BlockWrite(f,SaveData,sizeof(TSaveData));
finally
CloseFile(f);
end;
end;
ロードを忘れていました^^;
type
TSaveData=record a,b: String; end;
var
SaveData:TSaveData;
f:File;
begin
if FileExists(ChangeFileExt(Application.ExeName,'.savedata')) then
begin
AssignFile(f,ChangeFileExt(Application.ExeName,'.savedata'));
try
Reset(f,1);
BlockRead(f, SaveData, sizeof(TSaveData));
finally
CloseFile(f);
end;
end;
end;
>確認してください。
確認しました。
Notepadでは見れませんでした。
TtPIPICHさん、bobさん、SizeOf(TSaveData)の意味を一度よーく考えてみませんか?
見えないのは書き込めてないからでは?(笑
とにかく、テキストをそのまま書き込む限り、見えないことはありません。
ん?さんのように簡単な暗号化をするといいです。
> テキストをそのまま書き込む限り、見えないことはありません。
確かに私もその通りだと思って、私も試したわけです。
そしたら、メモ帳で開くとテキストとして見れませんでした。
で、私が言いたいのは他の方が示したコードを、試さないで否定するのはどうかと?
まぁ”質問者じゃないから試さない”ってのわかりますが、否定するんでしたら
試しましょってことです。
#構文エラーなら試さなくてもわかりますが。
偉そうに失礼しました。
>否定するんでしたら試しましょってことです。
試す前に間違いに気づいているからだと思われますが・・・
誰か教えてあげれば・・・
>TtPIPICHさん、bobさん、SizeOf(TSaveData)の意味を一度よーく考えてみませんか?
>型識別子を渡すと,その型のインスタンスを表わすために使用される容量(バイト数)を取得できます。
ヘルプより
http://www.miyabi-vs.co.jp/~c-works/tips/Lafie/adv08.html
参考にしたサンプルが見つかりました。
TtPIPICHさんの示したサンプルでは、文字列がどんなに長くても保存されるファイルは8バイトです。
# 圧縮処理なんてしてませんよね^^;
また、参考にしたというURLでは、Integer、Booleanなどの型ですが、String型は扱っていません。String型は可変長の変数などでなく、ポインタ型の変数と同等です。
ポインタを保存しても、次の読み込み時には保証されません。
>保存するデータは、グローバル宣言されている変数の中にある
>動的に生成しないもの、即ちIntegerやBooleanなどの変数です。
読み落としていました。
同じ過ちを二度犯してしまい、深く反省しております。
しばらくの間 関連するWWW掲示板への投稿は自粛させていただきます。
bobさん
>で、私が言いたいのは他の方が示したコードを、試さないで否定するのはどうかと?
いや、普通は書き込むときは大抵試してます。でも、今回のは試してませんが、
あまりに明らかな間違いなので・・・
大雪さんの指摘があるので、繰り返すのもしつこいかと思いまして、あえて指摘
しなかったのですが。ご不快でしたら申し訳ありませんでした。
> で、私が言いたいのは他の方が示したコードを、試さないで否定するのはどうかと?
りおりおさんも書いていらっしゃるように明らかに間違いなので必ずしも試す必要は無いと思います。
ただ、私は一応試してみましたが。
それよりも、bobさんの
> 確認してみましたが、できましたよ。
> 少なくともメモ帳で開いて、aaaやxxxが直接見ることは無かったです。
> ロードしてませんが..
はちょっとどうなんでしょうか。
保存した文字列が正しく復元されることを確認してからポストしていただきたかったです。
> しばらくの間 関連するWWW掲示板への投稿は自粛させていただきます。
ちゃんと動作確認してからコードを投稿するということに気をつければよいわけで、
投稿を自粛する必要はないと思いますよ。
> 保存した文字列が正しく復元されることを確認してからポストしていただきたかったです。
確かにその通りだと思います。
私のしたことはTtPIPICHさんのコピペだけでしたからね。
すみませんでした。以降気をつけます。
> TtPIPICHさんの示したサンプルでは、文字列がどんなに長くても保存されるファイルは8バイトです。
たっ確かに言われてみれば、そうですよね。
ただこの様に言われれば、私もすぐに納得できたのですが...
> 構造体とかにしてStream等で保存すれば普通のエディタでは見れないと思います。
ちと面白そうだったのでウォッチさせていただきました。
この一文を見ただけで分かる人は分かります。
TtPIPICHさんは以前からずっと自分で動作確認しない(できない?)回答をしているように思えます、もちろん質問に答えることで自分の学習にもなることは分かりますが、やっぱりもう少し謙虚になりましょうね。
よく一言でバシッと答える人がいて、それをカッコイイと思ってるひとがいるようですが、質問の内容から相手のレベルを判断して、この人なら伝わると判断できる時だけにしましょうね。
ある意味、大雪さんはTtPIPICHさんの事を「一言」で通じるレベルと過大評価してくれたんですから、TtPIPICHさん、答える側ならもうちょっとがんばってね…
17 年も前のスレッドですが,
「テキスト バイナリ 変換」で検索するとヒットしました.
最近,その内容に触れることがありました.
手前みそですが,以下の記事か参考になればと思います.
[ テキストをバイナリに変換して保存 ]
http://mrxray.on.coocan.jp/Delphi/Others/TextToBinary.htm
[ 882_テキストをバイナリデータ形式で保存]
http://mrxray.on.coocan.jp/Delphi/plSamples/882_TextSaveBinary.htm
話はそれるけど
>テキストファイルはバイナリファイルの一種ですけど。
違うんだな
ツイート | ![]() |