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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mona

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

#1

投稿記事 by mona » 13年前

バイナリデータを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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 13年前

mona さんが書きました:これですと \r に \n を上書きしているので意味が無くなってしまいます。
とはどういうことでしょうか?
見たところ、別の問題が見受けられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mona

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

#3

投稿記事 by mona » 13年前

みけCAT さん
問題とはインデックス配列数のことでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 13年前

i*array+ほげで直接位置を計算するのではなく、
ポインタまたは累積のバイト数を入れる変数で相対的に位置を計算したほうがやりやすいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mona

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

#5

投稿記事 by mona » 13年前

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

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

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#6

投稿記事 by みけCAT » 13年前

data.Length * array + data.Length/16 個の要素を最初に確保するべきだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

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

#7

投稿記事 by box » 13年前

そもそも、そういう「ドカッとしたサイズの」配列を持たないと
絶対にまずいんでしょうか。

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

エクレ

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

#8

投稿記事 by エクレ » 13年前

これ何の言語?
配列.LengthってCやC++ではそんなプロパティはなかったはずだけど。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

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

#9

投稿記事 by へにっくす » 13年前

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

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

コード:

string sz = "";
sz += '0';
sz += 'A';
sz += '\r';
sz += '\n';
てな感じで
最後に編集したユーザー へにっくす on 2012年11月17日(土) 19:45 [ 編集 1 回目 ]
written by へにっくす

needsueda

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

#10

投稿記事 by needsueda » 13年前

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

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

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

#11

投稿記事 by YuO » 13年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る