C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: バイナリエディタでのテキスト表示部の作成方法


(過去ログ 26 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■12193 / inTopicNo.1)  バイナリエディタでのテキスト表示部の作成方法
  
□投稿者/ Hirotow (107回)-(2008/01/04(Fri) 15:47:15)

分類:[C#] 

C#で作成したソフト上でバイナリデータを表示・編集する必要があるので簡易的なバイナリエディタコントロールを作っているのですが、
16進数の方はテキストボックスをごにょごにょといじってできても、右側のテキスト表示部分のほうがうまく作れません。
現在バイナリの0x20未満を0x20に変換した上でSjisのEncodingでGetStringして、WordWrapをTrueにしたテキストボックスに表示しているのですが表示できない文字やWordWrapのお節介でどうやっても16進とずれてしまいます。
どなたかずれずに表示する方法を知っている方がいたらご教示お願いします。
引用返信 編集キー/
■12194 / inTopicNo.2)  Re[1]: バイナリエディタでのテキスト表示部の作成方法
□投稿者/ PATIO (14回)-(2008/01/04(Fri) 17:20:59)
No12193 (Hirotow さん) に返信
> C#で作成したソフト上でバイナリデータを表示・編集する必要があるので簡易的なバイナリエディタコントロールを作っているのですが、
> 16進数の方はテキストボックスをごにょごにょといじってできても、右側のテキスト表示部分のほうがうまく作れません。
> 現在バイナリの0x20未満を0x20に変換した上でSjisのEncodingでGetStringして、WordWrapをTrueにしたテキストボックスに表示しているのですが表示できない文字やWordWrapのお節介でどうやっても16進とずれてしまいます。
> どなたかずれずに表示する方法を知っている方がいたらご教示お願いします。

ワードラップがいたずらするならワードラップをオフにすれば良いのではと思うのですけれど、
オフに出来ないわけがあるんでしょうか?
言われている内容からするとワードラップは必要なさそうな気がするんですけれど。
あと、こう言う表示をするのであれば、フォントを固定ピッチにしないと単なるテキストの流し込みでは
無理があると思います。プロポーショナルフォントを使うのであれば、自前で文字の位置を計算して
描画しないと位置が合わないはずです。

引用返信 編集キー/
■12197 / inTopicNo.3)  Re[2]: バイナリエディタでのテキスト表示部の作成方法
□投稿者/ Hirotow (108回)-(2008/01/04(Fri) 17:56:48)
以下のようなコードでSJISの範囲にある文字のみを変換することでうまくいきました。
int dispSize = 0x20 * 0x0F;
txtBinHex.Text = BitConverter.ToString(fileBuffer, dispPos, dispSize)
    .Replace('-', ' ');
StringBuilder binsb = new StringBuilder();
byte curBin, nexBin;
for (int i = 0; i < dispSize; i++)
{
    curBin = fileBuffer[dispPos + i];
    nexBin = fileBuffer[dispPos + i + 1];
    if ((0x20 <= curBin && curBin <= 0x7F)
        || (0xA0 <= curBin && curBin <= 0xDF))
    {
        binsb.Append(sjis.GetString(new Byte[] { curBin }));
    }
    else if ((0x81 <= curBin && curBin <= 0x9F)
        || (0xe0 <= curBin && curBin <= 0xfd))
    {
        if (0x40 <= nexBin)
        {
            binsb.Append(sjis.GetString(new Byte[] { curBin, nexBin }));
            i++;
        }
        else
        {
            binsb.Append(".");
        }
    }
    else
    {
        binsb.Append(".");
    }
    if (i % 16 == 15)
    {
        binsb.Append("\r\n");
    }
}
しかしながら、今度はテキストボックス側の文字コードがUTF-8であるため、
16進表示との選択位置の同期のたびにSJIS換算の文字数を計算しなければならず非常に動作が重たくなってしまいました。
またText→Hexで編集を同期する方法がまったくわかりません。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -