ページ 11

バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 15:11
by mona
バイナリデータを16進数に変換して画面に出力したいと考えています。
画面に出力する際に、16バイト目で改行を行いこれを繰り返していきたいのです。

ですが、改行コード \r \n を入れたいのですがどのようにすればいいのかわかりません。
下記のソースの赤い部分で改行の処理を行ったのですが、
これですと \r に \n を上書きしているので意味が無くなってしまいます。

どのようにすればいいのかご教授いただけないでしょうか。
宜しくお願いします。

code
// コード表
static char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

// バイナリデータを16進に変換します。
public static string BinToHexstr(byte[] data)
{
  int i; // ループ処理用
  int array = 3; // 1バイト中のインデックス配列数
  int arraycount = 15; // 文字列一行の制限数
  int bindata; // ビットデータ格納場所

  // 文字の長さを調べる
  char[] textdata = new char[ data.Length * array ];

  // 文字の長さを最大値とする
  for ( i = 0; i < data.Length; i++ )
  {
    bindata = data; // バイナリデータを並べる
    textdata[i * array] = hexDigits[bindata >> 4]; // 左4ビットを右に移動する
    textdata[i * array + 1] = hexDigits[bindata & 0xF]; // 右4ビットを1111でANDする
    textdata[i * array + 2] = ' '; // 1バイトに空白も含める

    // iが15バイトの倍数を超えた場合、カーソルは行の先頭に戻る
    if (i % (arraycount + 1) == arraycount)
    {
      textdata[i * array + 2] = '\r';
      // \rが配列に存在する場合、カーソルは次の行の先頭に送られる
      if (textdata[i * array + 2] == '\r')
      {
        textdata[i * array + 3] = '\n';
      }
    }

  }
  return new string( textdata ); // char型をstring型で返す
}
/code

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 15:32
by みけCAT
mona さんが書きました:これですと \r に \n を上書きしているので意味が無くなってしまいます。
とはどういうことでしょうか?
見たところ、別の問題が見受けられます。

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 15:45
by mona
みけCAT さん
問題とはインデックス配列数のことでしょうか?

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 16:03
by みけCAT
i*array+ほげで直接位置を計算するのではなく、
ポインタまたは累積のバイト数を入れる変数で相対的に位置を計算したほうがやりやすいと思います。

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 17:45
by mona
みけCAT さん
説明が不足していたことをお詫び申し上げます。
今回作成しているバイナリデータの変換部および画面に出力する際には、
16バイト分表示後改行を行っていくものでまた、Cで作成することです。

私が困っていたことは、1バイト中のインデックス配列数は3と指定しています。
この中には入れるのは、バイナリデータ変換後の16進数と空白を1バイトとした配列です。
例:[ 'A' '1' '_' ] =1バイト中のインデックス配列

そして16バイト目で改行を行うため\r\nをどのように扱えばいいのかでした。
16バイト目:[ 'A' '1' '_' ] この後に\r\nを入れたい
私は[ 'A' '1' '\r' '\n' ]としたいと考えていたが配列数は変えられないためエラーが出てしまう。

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 20:15
by みけCAT
data.Length * array + data.Length/16 個の要素を最初に確保するべきだと思います。

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 20:41
by box
そもそも、そういう「ドカッとしたサイズの」配列を持たないと
絶対にまずいんでしょうか。

単にバイナリーを何かに変換するだけなら、「1バイトずつ処理すればいいじゃん」と
思うのは、私が素人だからなんでしょうね、きっと。

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 20:52
by エクレ
これ何の言語?
配列.LengthってCやC++ではそんなプロパティはなかったはずだけど。

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年8月02日(木) 21:54
by へにっくす
エクレ さんが書きました:これ何の言語?
配列.LengthってCやC++ではそんなプロパティはなかったはずだけど。
たぶんC#でしょ。
みけCAT さんが書きました:data.Length * array + data.Length/16 個の要素を最初に確保するべきだと思います。
最初にどかっと配列でとるより
一文字ずつ変換して追加すればいいのでは?

そもそも最終的にstringにするなら
最初からstring変数に追加していけばいい気がするので。
だってchar型の追加できるしね。。

コード:

string sz = "";
sz += '0';
sz += 'A';
sz += '\r';
sz += '\n';
てな感じで

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年11月14日(水) 13:52
by needsueda
余りに初歩的なことなので忘れがちですが、表示だけなら
printf("%02x",c);とでもすれば16進数で表示できます。
16コードなら、一旦文字列に取り込み、
for(i=0;i<16; i++){ printf("%02x ",c);}でどうでしょうか。
横に16並べ、縦に流すなら1行津毎に改行文字を入れれば
よろしいかと。間にスペースを入れるのは見やすくするためです。
ひょっとしたら、改行コードの時に改行されるかも知れない恐れもなくなりますので。

Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが

Posted: 2012年11月15日(木) 00:55
by YuO
へにっくす さんが書きました:そもそも最終的にstringにするなら
最初からstring変数に追加していけばいい気がするので。
だってchar型の追加できるしね。。
C#ならこういう場合はStringBuilderというのがあってですね……。
# C#のStringはJavaと同じくimmutable。C++のstd::string相当 (mutable) はStringBuilder。
► スポイラーを表示