テキストファイルをバイナリファイルに変換


にいやん  2005-01-29 13:51:18  No: 12915  IP: [192.*.*.*]

テキストファイルをバイナリファイルに変換する方法が
分からずに困っています。
まだDELPHI初心者なので、よろしくお願いいたします。
DELPHI5を使用しています。

編集 削除
りおりお  2005-01-29 14:17:09  No: 12916  IP: [192.*.*.*]

??
テキストファイルはバイナリファイルの一種ですけど。
どうしたいのかもうすこし説明してください。

編集 削除
にいやん  2005-01-29 14:24:49  No: 12917  IP: [192.*.*.*]

りおりおさん、分かりづらくてごめんなさい。

例えばあるファイルに『レーザービーム』って
記述されているとします。

普通に開くとわかる文字を、分からなくしたいのです。

編集 削除
予想通り  2005-01-29 18:16:44  No: 12918  IP: [192.*.*.*]

過去に同じ質問の仕方をした方がいらっしゃいます。

https://www.petitmonte.com/bbs/answers?question_id=49

編集 削除
TtPIPICH  2005-01-31 21:00:24  No: 12919  IP: [192.*.*.*]

構造体とかにしてStream等で保存すれば普通のエディタでは見れないと思います。
見ようと思えば見れるかもしれませんが。

編集 削除
りおりお  2005-02-01 10:25:52  No: 12920  IP: [192.*.*.*]

構造体ていうか record 型にしても、文字列は個別にストリームに書き込みますので
見えますね。簡単な暗号化がよいと思います。

編集 削除
ん?  2005-02-01 10:33:34  No: 12921  IP: [192.*.*.*]

>構造体とかにして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;

編集 削除
TtPIPICH  2005-02-03 16:42:33  No: 12922  IP: [192.*.*.*]

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;
という風な感じで。
どこかのサイトに載っていた方法です。

編集 削除
大雪  2005-02-03 17:36:36  No: 12923  IP: [192.*.*.*]

>という風な感じで
TSaveDataの定義を書いてもらえませんか?

編集 削除
りおりお  2005-02-03 23:28:03  No: 12924  IP: [192.*.*.*]

> という風な感じで

実際に試してみましたか? 

1)ちゃんと書き込めましたか?
2)メモ帳や普通のエディタでテキストが見えませんでしたか?

確認してください。

編集 削除
bob  2005-02-05 13:26:34  No: 12925  IP: [192.*.*.*]

> 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;

編集 削除
TtPIPICH  2005-02-05 14:35:04  No: 12926  IP: [192.*.*.*]

ロードを忘れていました^^;

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では見れませんでした。

編集 削除
大雪  2005-02-05 16:30:40  No: 12927  IP: [192.*.*.*]

TtPIPICHさん、bobさん、SizeOf(TSaveData)の意味を一度よーく考えてみませんか?

編集 削除
りおりお  2005-02-05 19:30:30  No: 12928  IP: [192.*.*.*]

見えないのは書き込めてないからでは?(笑

編集 削除
りおりお  2005-02-05 19:32:55  No: 12929  IP: [192.*.*.*]

とにかく、テキストをそのまま書き込む限り、見えないことはありません。
ん?さんのように簡単な暗号化をするといいです。

編集 削除
bob  2005-02-06 17:03:23  No: 12930  IP: [192.*.*.*]

> テキストをそのまま書き込む限り、見えないことはありません。

確かに私もその通りだと思って、私も試したわけです。
そしたら、メモ帳で開くとテキストとして見れませんでした。

で、私が言いたいのは他の方が示したコードを、試さないで否定するのはどうかと?
まぁ”質問者じゃないから試さない”ってのわかりますが、否定するんでしたら
試しましょってことです。
#構文エラーなら試さなくてもわかりますが。

偉そうに失礼しました。

編集 削除
通りがかり  2005-02-06 18:04:13  No: 12931  IP: [192.*.*.*]

>否定するんでしたら試しましょってことです。
試す前に間違いに気づいているからだと思われますが・・・
誰か教えてあげれば・・・

編集 削除
TtPIPICH  2005-02-06 18:31:30  No: 12932  IP: [192.*.*.*]

>TtPIPICHさん、bobさん、SizeOf(TSaveData)の意味を一度よーく考えてみませんか?

>型識別子を渡すと,その型のインスタンスを表わすために使用される容量(バイト数)を取得できます。
ヘルプより

編集 削除
TtPIPICH  2005-02-06 18:50:58  No: 12933  IP: [192.*.*.*]

http://www.miyabi-vs.co.jp/~c-works/tips/Lafie/adv08.html
参考にしたサンプルが見つかりました。

編集 削除
にしの  2005-02-06 19:04:00  No: 12934  IP: [192.*.*.*]

TtPIPICHさんの示したサンプルでは、文字列がどんなに長くても保存されるファイルは8バイトです。
# 圧縮処理なんてしてませんよね^^;

また、参考にしたというURLでは、Integer、Booleanなどの型ですが、String型は扱っていません。String型は可変長の変数などでなく、ポインタ型の変数と同等です。
ポインタを保存しても、次の読み込み時には保証されません。

編集 削除
TtPIPICH  2005-02-06 19:05:35  No: 12935  IP: [192.*.*.*]

>保存するデータは、グローバル宣言されている変数の中にある
>動的に生成しないもの、即ちIntegerやBooleanなどの変数です。
読み落としていました。

編集 削除
TtPIPICH  2005-02-06 19:23:59  No: 12936  IP: [192.*.*.*]

同じ過ちを二度犯してしまい、深く反省しております。
しばらくの間 関連するWWW掲示板への投稿は自粛させていただきます。

編集 削除
りおりお  2005-02-06 21:11:48  No: 12937  IP: [192.*.*.*]

bobさん
>で、私が言いたいのは他の方が示したコードを、試さないで否定するのはどうかと?

いや、普通は書き込むときは大抵試してます。でも、今回のは試してませんが、
あまりに明らかな間違いなので・・・

大雪さんの指摘があるので、繰り返すのもしつこいかと思いまして、あえて指摘
しなかったのですが。ご不快でしたら申し訳ありませんでした。

編集 削除
大雪  2005-02-06 21:45:54  No: 12938  IP: [192.*.*.*]

> で、私が言いたいのは他の方が示したコードを、試さないで否定するのはどうかと?
りおりおさんも書いていらっしゃるように明らかに間違いなので必ずしも試す必要は無いと思います。
ただ、私は一応試してみましたが。
それよりも、bobさんの
> 確認してみましたが、できましたよ。
> 少なくともメモ帳で開いて、aaaやxxxが直接見ることは無かったです。
> ロードしてませんが..
はちょっとどうなんでしょうか。
保存した文字列が正しく復元されることを確認してからポストしていただきたかったです。

編集 削除
大雪  2005-02-06 22:46:35  No: 12939  IP: [192.*.*.*]

> しばらくの間 関連するWWW掲示板への投稿は自粛させていただきます。
ちゃんと動作確認してからコードを投稿するということに気をつければよいわけで、
投稿を自粛する必要はないと思いますよ。

編集 削除
bob  2005-02-07 21:04:23  No: 12940  IP: [192.*.*.*]

> 保存した文字列が正しく復元されることを確認してからポストしていただきたかったです。
確かにその通りだと思います。
私のしたことはTtPIPICHさんのコピペだけでしたからね。
すみませんでした。以降気をつけます。

> TtPIPICHさんの示したサンプルでは、文字列がどんなに長くても保存されるファイルは8バイトです。
たっ確かに言われてみれば、そうですよね。
ただこの様に言われれば、私もすぐに納得できたのですが...

編集 削除
ウオッチャー  2005-02-08 04:17:43  No: 12941  IP: [192.*.*.*]

> 構造体とかにしてStream等で保存すれば普通のエディタでは見れないと思います。
ちと面白そうだったのでウォッチさせていただきました。
この一文を見ただけで分かる人は分かります。
TtPIPICHさんは以前からずっと自分で動作確認しない(できない?)回答をしているように思えます、もちろん質問に答えることで自分の学習にもなることは分かりますが、やっぱりもう少し謙虚になりましょうね。
よく一言でバシッと答える人がいて、それをカッコイイと思ってるひとがいるようですが、質問の内容から相手のレベルを判断して、この人なら伝わると判断できる時だけにしましょうね。
ある意味、大雪さんはTtPIPICHさんの事を「一言」で通じるレベルと過大評価してくれたんですから、TtPIPICHさん、答える側ならもうちょっとがんばってね…

編集 削除
Mr.XRAY  2022-08-06 05:33:52  No: 150340  IP: [192.*.*.*]

17 年も前のスレッドですが,
「テキスト バイナリ 変換」で検索するとヒットしました.
最近,その内容に触れることがありました.
手前みそですが,以下の記事か参考になればと思います.

[  テキストをバイナリに変換して保存 ]
http://mrxray.on.coocan.jp/Delphi/Others/TextToBinary.htm

[ 882_テキストをバイナリデータ形式で保存]
http://mrxray.on.coocan.jp/Delphi/plSamples/882_TextSaveBinary.htm
  

編集 削除
AAAAA  2022-08-06 12:31:00  No: 150341  IP: [192.*.*.*]

話はそれるけど
>テキストファイルはバイナリファイルの一種ですけど。
違うんだな


編集 削除