• ベストアンサー

バイナリ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

  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • バイナリファイルからの文字列抽出

    バイナリファイルをCSVに変換するツールがございます。 CSV変換した後の文字列は、"日付" "数字"となっています。 今回、問題となっておりますのは、 バイナリファイルのサイズが大きく CSV変換に時間がかかってしまいます。 少しでもバイナリファイルのサイズを小さくするべく、 バイナリファイルから特定の"日付"を 抽出しようと考えておりますが、 可能でしょうか? また、その手法をご教授ください。 OSはWINDOWSです。 よろしくお願いします。

  • バイナリデータからの値の取得について教えてください

    今、バイナリデータから値を取りだそうとがんばっています。 しかし、うまくいかずに困っています。 困っていることは2点あります。 (1)バイナリデータにはリトルエンディアンで格納していると書いています。 まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか? (2)バイナリデータには、 はじめに文字列(char)型4バイトで「RIFF]という値 次に32ビット符号なし整数で4バイトの数字、 次に4052バイトの構造体 などと収納されているようです。 このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか? 全然できなくて困っています。 教えていただけないでしょうか? よろしくお願いいたします。

  • バイナリを16進表現の文字列に変換するには。。

    こんにちは。 データベースにバイナリ形式で入っているものを取り出して、16進表現の文字列(テキスト)に直さなくてはなりません。 バイナリを4文字ずつ取り出して、16進数に変えてを繰り返し、繋げてゆけばよいとは思うのですが、具体的な方法がいまいちわかりません。 データベースから取り出すとき、何型の変数に取り出して、どのようにして16進に直せば、効率よく処理を行うことが出来るでしょうか。

    • ベストアンサー
    • Java
  • Mscomm を使用してバイナリでデータを受信したい

    Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか? (垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >) また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか? まず考え方として以下の流れでよいでしょうか? バイナリデータをバリアント型の変数に入れる。(受信する)      ↓ このデータを1バイトごとにバイト型変数の配列に入れていく。      ↓ 格納した配列の中の制御文字を取り除く。( ST、EX )      ↓ 配列に入っているデータを文字に変換する。      ↓ 変換した文字をつなぐ。 受信するデーターが制御文字を含んでいる為、テキストで受信するとおかしな動作をすることがあるので(150バイト程度のデーターを、バッファから変数に移すときに、0.5~2.5秒もかかってしまうし、文字化けも時々起こす。)バイナリで受信してその後文字に変換したいのですが・・・。 宜しくお願い致します。

  • 8桁文字列を16進数バイト配列に変換

    お世話になります。 VB2005を使用しています。 温調器から温度データを引っ張るプログラムを作成しています。 8桁の文字列を16進数バイト配列に変換したいのですが、GetBytesでは10進数バイト配列に変換されてしまいます。 8桁の文字列又は10進数バイト配列を16進数バイト配列に変換する方法はないでしょうか? 文字列を1文字ずつ16進数に変換して配列に組み込んでいくしかないのでしょうか? よろしくお願い致します。

  • C# ファイル→バイナリ→ファイルの変換

    いつもお世話になっています。 只今、エクセルやワードなどのファイルをバイナリデータに変換し DBへ格納するプログラムを作成しています。 使用しているDBはSQLServerです バイナリデータに変換して格納することは出来ました ですが、そこから元のファイルに戻す方法が分かりません やりたいことは  1:バイナリデータを復元  2:ダウンロードする  3:ダウンロードすることなく開く の3つです 調べ方が悪いのか、全く見つからず困っています。 WebではなくWindowsフォームがベースのプログラムです サンプルや手順などがわかる方、よろしくお願いします。

  • 文字列からバイナリ変換

    C言語で *argv[]にMacAddress00-0F-1F-16-80-F4などを入力し、 それをバイナリに変換して、int8_t mac_add[6]みたいなものに 代入したいと思っているのですが、 方法がわからず苦戦しております。 宜しくお願い致します。 イメージ mac_add[0] = 00←バイナリ以下同じ mac_add[1] = 0F mac_add[2] = 1F mac_add[3] = 16 mac_add[4] = 80 mac_add[5] = F4

  • バイナリの文字列を変換したい...

    Jpeg のExifを解析するスクリプトを書いてます あるバイナリの文字列を下記の形式に 変換する手段をどなたかご存知ないですか? (そもその下記の意味さえわからないですが) unsigned byte ascii strings unsigned short unsigned long unsigned rational signed byte signed short signed long signed rational single float double float よろしくお願い致します

    • 締切済み
    • PHP
  • バイナリデータの検索(VB.NET2008)

    バイナリファイルを読込み、バイト配列に格納しています。 aaa(0) = 0 aaa(1) = 90 aaa(2) = 0 aaa(3) = 255 aaa(4) = 255 aaa(5) = 0 aaa(6) = 255 この配列から、「FFFF」が見つかった位置を検索したいと考えています。 (上の例で言うと3を取得したい) 現在は配列の最初から最後まで1バイトずつずらして読込み、見つかった場所を特定しています。16進表記の文字列に変換し、文字列として検索する方法も考えましたが、どちらも非効率な気がしています。 他のやり方を知っている方がいましたら教えてください。 [環境] VB2008,XP32SP3

専門家に質問してみよう