バイナリエディタ

解決


ちょん  2004-05-13 16:09:03  No: 83344  IP: [192.*.*.*]

簡単なバイナリエディタを作成しようと思ったんですが、小さいファイルは出力することが出来るんですがある程度大きいファイルになるとjoin関数で正常に結合できません。join関数が使用できる。最大index値ってあるんでしょうか?

どなたかお知恵をお貸し下さい。
環境はVB6.0です。
参考コード抜粋
Dim buf() As Byte
Dim buf2() As String
            
Open filename For Binary As #1
Get #1, , buf()
Close #1
         
For cnt = 0 To UBound(buf2)
buf2(cnt) = Hex(buf(cnt))
Next
            
Text1.Text = Join(buf2)

編集 削除
いちゆ  2004-05-13 16:55:38  No: 83345  IP: [192.*.*.*]

…Join関数を使うより、Stringの結合で書いたほうがはやそうだが?
あと、「正常に結合できません」ってーのはどういう状態なんだかわからん。

編集 削除
GOD  2004-05-13 18:01:10  No: 83346  IP: [192.*.*.*]

テキストボックスには制限がありますよ。
Textプロパティのヘルプ参照。

編集 削除
ちょん  2004-05-13 20:12:24  No: 83347  IP: [192.*.*.*]

いちゆさん、GODさんお返事ありがとうございます。

>Stringの結合で書いたほうがはやそうだが?
これだと処理に時間がかかるというより、処理途中でオーバーフローしました。

>「正常に結合できません」ってーのはどういう状態なんだかわからん。
配列の一定の位置までしか結合出来ませんでした。
結合可能なインデックス最大値が決まってるんでしょうか?

>テキストボックスには制限がありますよ。
制限にはいたっておりませんでした。

編集 削除
のん  2004-05-13 20:19:19  No: 83348  IP: [192.*.*.*]

具体的に何バイトのファイルを開いて何文字まで結合できたのでしょうか?

編集 削除
ちょん  2004-05-13 20:36:09  No: 83349  IP: [192.*.*.*]

>テキストボックスには制限がありますよ。
制限にはいたっておりませんでした。

すいませんでした。再度確認したところテキストボックスの制限のようでした。お手数おかけしました。

いちゆさん、GODさん、のんさんありがとうございました。

編集 削除
魔界の仮面弁士  2004-05-13 20:41:12  No: 83350  IP: [192.*.*.*]

> buf2(cnt) = Hex(buf(cnt))
これって、
  buf2(cnt) = Right("00" & Hex(buf(cnt)), 2)
のようにしなくても大丈夫ですか?

例えば、Hex(14) は "0E" ではなく "E" を返しますから、
桁数を合わせておかないと、桁数が変わってしまいますよね。

>>Stringの結合で書いたほうがはやそうだが?
ループで、「S = S & 追加文字」を繰り返す方式だと、Join以上に
遅くなりますので、Midステートメント(Mid関数に非ず)を使って
編集するようにすると良いでしょうね。

> これだと処理に時間がかかるというより、処理途中でオーバーフローしました。
どの処理を行っている部分でオーバーフローになりましたか?

> 配列の一定の位置までしか結合出来ませんでした。
常に「一定」の位置以降のデータが結合できない、という事ですね。
具体的には、何番目の項目まで結合できましたか?

> 制限にはいたっておりませんでした。
TextBoxのサイズ制限に関しては、ヘルプの記述は、若干間違っていますので、
あまり鵜呑みにしない方が良いかも。(^^;)

編集 削除
ちょん  2004-05-14 08:57:57  No: 83351  IP: [192.*.*.*]

魔界の仮面弁士さんレスありがとうございます。

> 配列の一定の位置までしか結合出来ませんでした。
これは65535文字までしか結合できませんでした。
正確には結合はできてるけど、1度に表示ができないんでしょうか?

実験的に次のようなプログラムを作ってみました。

Dim cnt As Long
Dim test() As String
ReDim test(50000) As String
Text1.text = ""

    For cnt = 0 To UBound(test)
    test(cnt) = cnt
    Next

Text1.text = Join(test)
MsgBox Len(Text1.text)

結合処理は途中で終わっておりました。
そして、最後に返されるメッセージボックスの数値は65535でした。


>Midステートメント(Mid関数に非ず)を使って
>編集するようにすると良いでしょうね。
具体的なほう例を教えていただけるとたすかります。

どうやらテキストボックスの制限でもないようでした。^^;
お手上げでございます。

編集 削除
ちょん  2004-05-14 09:15:59  No: 83352  IP: [192.*.*.*]

join関数が正常に結合できてるか確認するため
最後の部分を以下のように変更してみました、結果は288895文字と表示されたんで結合できていると思います。
それをテキストボックスに表示しようとすると、65535文字しか表示できないのはテキストボックスの制限なんでしょうか?2byte-65536?です。


temp = Join(test)

MsgBox Len(temp)
Text1.text = temp
MsgBox Len(Text1.text)

編集 削除
魔界の仮面弁士  2004-05-14 10:51:34  No: 83353  IP: [192.*.*.*]

> これは65535文字までしか結合できませんでした。
判断方法が間違っています。
提示されたコードでは、Join関数の制限なのか、TextBoxの制限なのかを判断できませんよね。

  S = Join(配列)
  Text1.Text = S
のように、処理を2段階に分けてください。
そうすれば、Join側の問題なのか、TextBox側の問題なのかを判断できるでしょう。
(結論から言えば、TextBox側の制限なわけですが)

# 突き詰めていくと、String型自体にもサイズ制限があったりしますが、
# 今回はそこまでのサイズになる事は無いでしょうね。


> そして、最後に返されるメッセージボックスの数値は65535でした。
これが、先に書いた
>> TextBoxのサイズ制限に関しては、ヘルプの記述は、若干間違っていますので、
>> あまり鵜呑みにしない方が良いかも。(^^;)
の事だったりします。(^_^;)

TextBoxが表示できるデータ量と、プロパティ等で制御できるデータ量の上限は
かならずしも同じでは無いのです。

WinNT系とWin9X系では、TextBox自体が扱える上限サイズに違いがありますが、
それとは別に、プロパティで管理できるサイズにも上限があったりするのです。
http://www.geocities.co.jp/SiliconValley-SanJose/8756/vb.html


ちなみに、ListBox等にも同様の制限があります。

NT系ListBoxでは、9X系ListBoxよりも多くの項目を追加できますが、
ListIndexプロパティ値がInteger型であるため、ListIndex=32767の
次の項目が -32768 を返してしまう事になります。

編集 削除
GOD  2004-05-14 11:06:45  No: 83354  IP: [192.*.*.*]

> > これは65535文字までしか結合できませんでした。
> 判断方法が間違っています。
> 提示されたコードでは、Join関数の制限なのか、TextBoxの制限なのかを判断
> できませんよね。
>
提示されてるサンプルでいいのでは?
結局のところテキストボックスに表示できる限界以上を表示したいのなら
RichTextBoxを使用して下さい。
VB6ならIDEからプロジェクトメニュー→コンポーネントでMicrosoft Rich TextBox Control 6.0をチェックすれば使用できるようになりますので。

編集 削除
ちょん  2004-05-14 11:48:34  No: 83355  IP: [192.*.*.*]

魔界の仮面弁士 さんGODさんレスありがとうございます。

>魔界の仮面弁士 さん
何度も丁寧な説明ありがとうございました。
チェックの仕方が間違ってましたか^^;はずかしい〜

>GODさん
RichTextBoxを使ってみました、結果は出来ました。!!
が。
やっぱ処理に時間がかかりすぎですね、VBじゃ無理なのだろうか・・・

何はともあれ問題が解決したのは皆様のおかげです。
ありがとうございました。

編集 削除
魔界の仮面弁士  2004-05-14 12:47:25  No: 83356  IP: [192.*.*.*]

> 提示されてるサンプルでいいのでは?
すみません、回答がすれ違いになったようです。(^^;)
09:15:59の投稿を見る前に投稿を[送信]してしまったので。


> やっぱ処理に時間がかかりすぎですね、
どのくらいのファイルサイズなのか、にもよりますが、データ全体を(Rich)TextBoxに収めると、遅くなってしまうでしょう。(RichTextBoxは、比較的「重い」コントロールです)

> VBじゃ無理なのだろうか・・・
MSHFlexGridにデータバインドで表示させる方式だと、比較的高速に表示されるという話は聞いた事があります。試した事はありませんけど。

なお、高速なバイナリエディタでは、画面に見えている範囲(+α)程度の領域だけを描画し、それ以外の部分は、実際にスクロールされまで描画しない…という手法が使われているようです。実際に、一度に画面に表示できるデータ量というのは、そんなに多くありませんから。

編集 削除
ちょん  2004-05-14 13:09:16  No: 83357  IP: [192.*.*.*]

魔界の仮面弁士 さんへ
>画面に見えている範囲(+α)程度の領域だけを描画し、それ以外の部分は、実>際にスクロールされまで描画しない…

ヒントありがとうございます。
色々な方法があるんですね。
これを作って何をしたいわけではないのですが、いろいろ挑戦してみたいと思います。ありがとうございました。

編集 削除