- ベストアンサー
バイナリ5バイトを文字10バイトに変換
バイナリ5バイトを文字10バイトに変換 いつもお世話になっています。 C++初心者です。 12 34 56 78 90(バイナリ5バイト)を 1234567890(文字10バイト)に変換する方法はありますか? バイナリで読み込んだデータがあり、特定箇所に、数字10桁が格納されてます。 下記イメージです。 12 34 56 78 90(バイナリ5バイト) それを文字10バイトで処理するしたいのですが、変換方法がネットで探せませんでした。 お知恵をお貸しください。 環境はVC++6 です。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 バイナリデータの形式(フォーマット)を、もう少し具体的にご説明願えないでしょうか? 解釈の違いにより、以下のように、幾つかのパターンが考えられますので。。。 ※下記以外のパターンも考えられると思います。 ※下記例は、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-数値変換」の項を参照。 以上です。
その他の回答 (2)
- n2201makita
- ベストアンサー率30% (8/26)
#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); }
お礼
回答ありがとうございます。 10進数、16進数の提供情報の不足の補完ありがとうございます。 10進数のほうを参考にさせていただきます。
- iandt2251
- ベストアンサー率28% (4/14)
VCが詳しくありませんがC++のレベルで説明します。 Sprintfを利用して、16進数で編集すれば良いと思います。 Sprintf(Buff, "%x%x%x%x%x", dat[0],dat[1],dat[2],dat[3],dat[4]);
お礼
回答ありがとうございます。 sprintfでいけそうですね。 これをキーワードにもう少し調べてみます。 ありがとうございました。
お礼
回答ありがとうございます。 今回の質問はパターン1の状態です。 参考にさせていただきます^^