• ベストアンサー

バイナリ5バイトを文字10バイトに変換

バイナリ5バイトを文字10バイトに変換 いつもお世話になっています。 C++初心者です。 12 34 56 78 90(バイナリ5バイト)を 1234567890(文字10バイト)に変換する方法はありますか? バイナリで読み込んだデータがあり、特定箇所に、数字10桁が格納されてます。 下記イメージです。 12 34 56 78 90(バイナリ5バイト) それを文字10バイトで処理するしたいのですが、変換方法がネットで探せませんでした。 お知恵をお貸しください。 環境はVC++6 です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.2

こんにちは。 バイナリデータの形式(フォーマット)を、もう少し具体的にご説明願えないでしょうか? 解釈の違いにより、以下のように、幾つかのパターンが考えられますので。。。 ※下記以外のパターンも考えられると思います。 ※下記例は、1バイト=8ビットとした場合のものです。 ■パターン1  BCD値(2進化10進符号)  <変換元データの例>   1バイト目: 0x12 ⇒ 変換後の文字イメージ: '1'、'2'   2バイト目: 0x34 ⇒ 変換後の文字イメージ: '3'、'4'   3バイト目: 0x56 ⇒ 変換後の文字イメージ: '5'、'6'   4バイト目: 0x78 ⇒ 変換後の文字イメージ: '7'、'8'   5バイト目: 0x90 ⇒ 変換後の文字イメージ: '9'、'0'  <変換手順の例>   1)バイナリデータから、1バイト分読込む。   2)読込んだデータ(1バイト)を、【上位4ビット】と【下位4ビット】に分割した    値を作成。   3)分割した値をそれぞれ、数字文字(10進数字)に変換する。   4)変換後の文字(2文字分)を、文字列バッファに格納する。   5)5バイト分、上記1)~4)の処理を繰り返す。  ※こちらの場合は、#1さんのようにsprintf等で、"%02x"等の指定により、   一括して変換する方法も考えられます。    例)     sprintf(sBuf, "%02x%02x%02x%02x%02x",       bBuf[0], bBuf[1], bBuf[2], bBuf[3], bBuf[4]);     ・bBuf: 変換元のバイナリデータバッファ     ・sBuf: 変換後の文字列格納バッファ ■パターン2  10進値のバイナリデータ(内部16進値イメージ)  <変換元データの例>   1バイト目: 0x0c (10進値=12) ⇒ 変換後の文字イメージ: '1'、'2'   2バイト目: 0x22 (10進値=34) ⇒ 変換後の文字イメージ: '3'、'4'   3バイト目: 0x38 (10進値=56) ⇒ 変換後の文字イメージ: '5'、'6'   4バイト目: 0x4e (10進値=78) ⇒ 変換後の文字イメージ: '7'、'8'   5バイト目: 0x5a (10進値=90) ⇒ 変換後の文字イメージ: '9'、'0'  <変換手順の例>   1)バイナリデータから、1バイト分読込む。   2)読込んだデータ(1バイト)を、10進値として【10の位】と【1の位】に分割した    値を作成。   3)分割した値をそれぞれ、数字文字(10進数字)に変換する。   4)変換後の文字(2文字分)を、文字列バッファに格納する。   5)5バイト分、上記1)~4)の処理を繰り返す。  ※こちらの場合は、sprintf等で、"%02d"等の指定により、一括して変換する   方法も考えられます。    例)     sprintf(sBuf, "%02d%02d%02d%02d%02d",       bBuf[0], bBuf[1], bBuf[2], bBuf[3], bBuf[4]);     ・bBuf: 変換元のバイナリデータバッファ     ・sBuf: 変換後の文字列格納バッファ 上記のように、フォーマットの違いにより、処理方法も変わってきます。 ※C++であれば、STLなどを使用して簡単に変換できる方法があるかもしれません。 ■参考サイト C/C++ サンプルプログラム http://tsuga-memo.hp.infoseek.co.jp/program/c_cpp/sample.html ・「string-数値変換」の項を参照。 以上です。

nekotaru
質問者

お礼

回答ありがとうございます。 今回の質問はパターン1の状態です。 参考にさせていただきます^^

その他の回答 (2)

回答No.3

#pragma warning(disable:4996) #include <stdio.h> int main(void){ FILE *ifp, *ofp; int i; unsigned char data; ifp = fopen("indata.txt", "rb"); if(!ifp) return 1; ofp = fopen("outdata.txt", "wb"); if(!ofp) {fclose(ifp); return 1;} for(i=0; i<5; i++){ data = getc(ifp); fprintf(ofp, "%02X", data); /* 12 34 56 78 90 が、16進数の場合 */ /* fprintf(ofp, "%02D", data); *//* 12 34 56 78 90 が、10進数の場合 */ } fclose(ifp); fclose(ofp); }

nekotaru
質問者

お礼

回答ありがとうございます。 10進数、16進数の提供情報の不足の補完ありがとうございます。 10進数のほうを参考にさせていただきます。

  • iandt2251
  • ベストアンサー率28% (4/14)
回答No.1

VCが詳しくありませんがC++のレベルで説明します。  Sprintfを利用して、16進数で編集すれば良いと思います。  Sprintf(Buff, "%x%x%x%x%x", dat[0],dat[1],dat[2],dat[3],dat[4]);

nekotaru
質問者

お礼

回答ありがとうございます。 sprintfでいけそうですね。 これをキーワードにもう少し調べてみます。 ありがとうございました。

関連するQ&A