バイナリデータを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: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
とはどういうことでしょうか?mona さんが書きました:これですと \r に \n を上書きしているので意味が無くなってしまいます。
見たところ、別の問題が見受けられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
i*array+ほげで直接位置を計算するのではなく、
ポインタまたは累積のバイト数を入れる変数で相対的に位置を計算したほうがやりやすいと思います。
ポインタまたは累積のバイト数を入れる変数で相対的に位置を計算したほうがやりやすいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
mona
Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
みけCAT さん
説明が不足していたことをお詫び申し上げます。
今回作成しているバイナリデータの変換部および画面に出力する際には、
16バイト分表示後改行を行っていくものでまた、Cで作成することです。
私が困っていたことは、1バイト中のインデックス配列数は3と指定しています。
この中には入れるのは、バイナリデータ変換後の16進数と空白を1バイトとした配列です。
例:[ 'A' '1' '_' ] =1バイト中のインデックス配列
そして16バイト目で改行を行うため\r\nをどのように扱えばいいのかでした。
16バイト目:[ 'A' '1' '_' ] この後に\r\nを入れたい
私は[ 'A' '1' '\r' '\n' ]としたいと考えていたが配列数は変えられないためエラーが出てしまう。
説明が不足していたことをお詫び申し上げます。
今回作成しているバイナリデータの変換部および画面に出力する際には、
16バイト分表示後改行を行っていくものでまた、Cで作成することです。
私が困っていたことは、1バイト中のインデックス配列数は3と指定しています。
この中には入れるのは、バイナリデータ変換後の16進数と空白を1バイトとした配列です。
例:[ 'A' '1' '_' ] =1バイト中のインデックス配列
そして16バイト目で改行を行うため\r\nをどのように扱えばいいのかでした。
16バイト目:[ 'A' '1' '_' ] この後に\r\nを入れたい
私は[ 'A' '1' '\r' '\n' ]としたいと考えていたが配列数は変えられないためエラーが出てしまう。
Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
data.Length * array + data.Length/16 個の要素を最初に確保するべきだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
そもそも、そういう「ドカッとしたサイズの」配列を持たないと
絶対にまずいんでしょうか。
単にバイナリーを何かに変換するだけなら、「1バイトずつ処理すればいいじゃん」と
思うのは、私が素人だからなんでしょうね、きっと。
絶対にまずいんでしょうか。
単にバイナリーを何かに変換するだけなら、「1バイトずつ処理すればいいじゃん」と
思うのは、私が素人だからなんでしょうね、きっと。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
たぶんC#でしょ。エクレ さんが書きました:これ何の言語?
配列.LengthってCやC++ではそんなプロパティはなかったはずだけど。
最初にどかっと配列でとるよりみけCAT さんが書きました:data.Length * array + data.Length/16 個の要素を最初に確保するべきだと思います。
一文字ずつ変換して追加すればいいのでは?
そもそも最終的にstringにするなら
最初からstring変数に追加していけばいい気がするので。
だってchar型の追加できるしね。。
てな感じで
最後に編集したユーザー へにっくす on 2012年11月17日(土) 19:45 [ 編集 1 回目 ]
written by へにっくす
-
needsueda
Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
余りに初歩的なことなので忘れがちですが、表示だけなら
printf("%02x",c);とでもすれば16進数で表示できます。
16コードなら、一旦文字列に取り込み、
for(i=0;i<16; i++){ printf("%02x ",c);}でどうでしょうか。
横に16並べ、縦に流すなら1行津毎に改行文字を入れれば
よろしいかと。間にスペースを入れるのは見やすくするためです。
ひょっとしたら、改行コードの時に改行されるかも知れない恐れもなくなりますので。
printf("%02x",c);とでもすれば16進数で表示できます。
16コードなら、一旦文字列に取り込み、
for(i=0;i<16; i++){ printf("%02x ",c);}でどうでしょうか。
横に16並べ、縦に流すなら1行津毎に改行文字を入れれば
よろしいかと。間にスペースを入れるのは見やすくするためです。
ひょっとしたら、改行コードの時に改行されるかも知れない恐れもなくなりますので。
Re: バイナリコード変換時の処理に改行コードを含めて処理をしたいのですが
C#ならこういう場合はStringBuilderというのがあってですね……。へにっくす さんが書きました:そもそも最終的にstringにするなら
最初からstring変数に追加していけばいい気がするので。
だってchar型の追加できるしね。。
# C#のStringはJavaと同じくimmutable。C++のstd::string相当 (mutable) はStringBuilder。
► スポイラーを表示