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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.12193 の関連記事表示

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

    分類:[C#] 

    C#で作成したソフト上でバイナリデータを表示・編集する必要があるので簡易的なバイナリエディタコントロールを作っているのですが、
    16進数の方はテキストボックスをごにょごにょといじってできても、右側のテキスト表示部分のほうがうまく作れません。
    現在バイナリの0x20未満を0x20に変換した上でSjisのEncodingでGetStringして、WordWrapをTrueにしたテキストボックスに表示しているのですが表示できない文字やWordWrapのお節介でどうやっても16進とずれてしまいます。
    どなたかずれずに表示する方法を知っている方がいたらご教示お願いします。
親記事 /過去ログ26より / 関連記事表示
削除チェック/

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

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

■12197  Re[2]: バイナリエディタでのテキスト表示部の作成方法
□投稿者/ Hirotow -(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で編集を同期する方法がまったくわかりません。
記事No.12193 のレス /過去ログ26より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -