• ベストアンサー

ヘキサコードとバイナリについて

ヘキサコードの文字列をバイナリに変換する事ができずに困っています。 ヘキサコードの「31 32 33」という値を持っていれば、 ファイルに出力した時に、 「1 2 3」と出力するようにしたいと思っています。 何か関数が用意されていたりしないでしょうか? 宜しくお願いします。 環境 windows xp sp2 VC++2005

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★もしかして? ・ヘキサコードとは16進文字列のことかな?  これならば atoi() 関数では整数値に変換できません。  ご自分で類似関数 htoi() などを作成して下さい。 サンプル: #include <ctype.h> #include <stdio.h> // 16進文字→整数値に変換 int HexToVal( char c ) {  if ( isxdigit(c) ){   if ( isdigit(c) ) return c - '0';   if ( isupper(c) ) return c - 'A' + 10;   return c - 'a' + 10;  }  return -1; } // メイン関数 int main( void ) {  char *p, hex[] = "31 32 33"; ←16進文字列(ヘキサコード)  int value[ 3 ]; ←変換後の整数配列  int hi, lo; ←分かりやすく用意    // 初期化  p = hex;    // 1,2桁目  hi = HexToVal( *p++ );  lo = HexToVal( *p++ );  value[ 0 ] = (hi << 4) | lo;  p++;  // 4,5桁目  hi = HexToVal( *p++ );  lo = HexToVal( *p++ );  value[ 1 ] = (hi << 4) | lo;  p++;  // 7,8桁目  hi = HexToVal( *p++ );  lo = HexToVal( *p++ );  value[ 2 ] = (hi << 4) | lo;  p++;    // 出力  printf( "%c %c %c\n", value[0], value[1], value[2] );  return 0; } ※変換の仕組みを分かりやすくするようにループは使っていません。

_ab
質問者

お礼

ヘキサコードは16進文字列のことです。 言葉足らずで申し訳ありません。 サンプルコードを参考にさせて頂いています。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

回答No.9

下記のURLをご紹介しておきます。 この中の、makeString() という関数が、そのような働きをします。 引数として桁数が必要ですが。 char src[] = "313233"; char dest[4] であれば、 makeString(src, dest, 3); で、dest[] に "123" が入ります。(最後の '\0' は付加しません) 処理内容はすでに回答されているものと同じです。

参考URL:
http://www.nest4.net/tec/strnum.html
全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.8

★回答者No.2です。 >やりたい事は >変数内の16進文字列「313233」を「123」に変換したいということです。  ↑  空白文字がないんですか。  これだと strtoul() 関数は利用できません。 ・この質問は16進2桁を1つの文字に変換するという趣旨ですよね。  だから16進文字列の『31』『32』『33』を『123』の文字列に変換したいという事だな。  空白がないのでやはり変換用の関数を用意します。  基本的な考えは回答 No.2 と同じです。  今回は16進2桁を読み込み1文字のASCIIコードを返す関数を載せておきます。 サンプル: #include <ctype.h> #include <stdio.h> // 16進文字→整数値に変換 int HexToVal( char c ) {  if ( isxdigit(c) ){   if ( isdigit(c) ) return c - '0';   if ( isupper(c) ) return c - 'A' + 10;   return c - 'a' + 10;  }  return -1; } // 16進2桁を1文字に変換 char HexToChr( const char **string ) {  const char *p = *string;  int hi, lo;    if ( *p == '\0' ){   return 0x00;  }  hi = HexToVal( *p++ );  lo = HexToVal( *p++ );  *string = p;  return (hi << 4) | lo; } // メイン関数 int main( void ) {  char hex[] = "313233"; ←16進文字列(ヘキサコード)  char *p = hex;  char c;    while ( (c = HexToChr(&p)) != '\0' ){   fputc( c, fp ); ←『fp』は適切なファイルポインタを指定  }  return 0; } 以上。参考に。

全文を見る
すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

No6です。 申し訳ない、 No6冒頭の「No2」は「No3」に訂正願います。 No2さん申し訳ない。

全文を見る
すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.6

No2です。 (補足頂いたのですが、イマイチ?) >char hex[] = "313233"; >のような感じです。 ・(略) >やりたい事は >変数内の16進文字列「313233」を「123」に変換したいということです。 ★「・・を◆文字列『123』に変換したい・・」ですね。 ☆他の回答者の方は、「・・を◆数値『313,233』に変換したい・・」と捉えているようですよ(皆さん「専門家」だから、やっぱ年寄りが間違っているのかなぁ)。 ★年寄りは単純に・・。 char hex[] = "313233"; int nn = 0; while( 1 ){ if( 0x00 == hex[nn] ) break; if( 0 == ( nn % 2 ) ){ // ここで nn を nn++ としない nn++; continue; } printf( "%c", hex[nn++] ); } printf( "\n" ); ★なんのチェックもせずに、ひとつおきにコンソールに出力してるだけです。

全文を見る
すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★回答者No.2です。 ・『strtoul』の存在をすっかり忘れていました。  これを使えば一発です。 ・下の『参考URL』をどうぞ。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtoul.html
全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

16進文字列を数値に変換するには、strtoul関数をつかうといいです。

全文を見る
すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>ヘキサコードの文字列をバイナリに変換する事ができずに困っています。 ☆ちょっと整理(「ヘキサコードの文字列」って何?)  コードの対象は8ビット     ↓ バイナリで 00000000~11111111、ヘキサコードで 00~FF  ★単なる表現の違いのみ=値は同じ → 「変換する」必要は???  「表現する事は」とすると、 ・ヘキサコード1桁 0~F に対応するバイナリ『表現』のテーブルを16種用意( "0000"~"1111" )。 ・前後4ビットを 0xF0,0x0F でマスク → テーブルへ代入・バイナリ表現。 >ヘキサコードの「31 32 33」という値を持っていれば、 >ファイルに出力した時に、 >「1 2 3」と出力するようにしたいと思っています。 ★「ヘキサコードの『31 32 33』という値を持って」の意味するところは、 cStrH[0] = 0x31; cStrH[1] = 0x20; cStrH[2] = 0x32; cStrH[3] = 0x20; cStrH[4] = 0x33; cStrH[5] = 0x00; ・・ですよね(違っていましたら◆補足願います)。 これですと、なんも考えず、  fprintf( fp1, "%s\n", cStrH ); または、  fprintf( fp1, "%c %c %c\n", cStrH[0], cStrH[2], cStrH[4] ); って、こんなんじゃあ質問しないよね、・・・上の◆補足要求、ご対応願います(できましたら私の書き方で・・)。 【参考】 http://www.k-cube.co.jp/wakaba/server/format.html http://e-words.jp/p/r-ascii.html

_ab
質問者

補足

ヘキサコードの文字列は16進文字列のつもりで書いていました。 // 参考URLに貼って頂いているアスキー文字コードの0x00~0x7fです。 「ヘキサコードの『31 32 33』という値を持って」という部分は char hex[] = "313233"; のような感じです。 // 空白は見やすくしようとして入れていました。紛らわしくてすいません。 やりたい事は 変数内の16進文字列「313233」を「123」に変換したいということです。 提示して頂いた fprintf( fp1, "%s\n", cStrH ); のようなやり方は失念していました・・・ 今見つけたばかりなんですが、 http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide14-1.html にも似たような事を書いてますし・・・ このやり方も調べてみようと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

そのヘキサコードを格納しているのは char型の配列ってことでしょうか? Cランタイムライブラリの使用などは出来るのですか それとも自前でint型などの数値型に変換しないといけないのでしょうか ランタイムを使っていいなら atoi()などで変換可能です char型の配列として持っているなら #『31 32 33 00』で構成されているなら … 最後の00が重要 char buf[] = "123"; int num = 0; char *p = buf; // char配列を1から順になめる while( *p ) {   // 前回の結果を10倍する   num *= 10;   // 現在参照しているポイントのデータから   // '0'(0x30)を減算したものを加算する   num += ( *p ) - '0';   // ポインタを1つ進める   p++; } といった具合で numに数値化されたデータを取得出来ます

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • バイナリコードを見つけ出すツールを教えてください

    私のパソコン内にテキストコードのみで構成される拡張子がtxtやhtmlのファイルが大量にあります。 パソコンがウイルスに感染すると、パソコン内のファイルがいつの間にか変更されていることがありますが、変更されているかどうかを調べるためにバイナリコードを見つけ出すツールを探しています。 テキストコードのみで構成されていたファイルの中身が変更されていたなら、バイナリコードが付加されているはずなので、バイナリコードを見つけ出すことが出来れば、そのファイルの中身が変更されていることが分かるという判断です。 notepadでバイナリファイルを開くと、黒い四角や難しい漢字、半角のカタカナなどが表示されるので、とりあえず その黒い四角 をコピーして 試しに GrepReplaceで、検索文字列の欄に 黒い四角 をペーストして、あるファイル(テキストコードのみのファイルにバイナリファイルを結合させたファイル)の中身を検索しましたが、 黒い四角があるはずなのに、GrepReplaceでは残念ながらヒットしませんでした。 バイナリコードである 黒い四角 を検索文字列にして検索をすると、的確にヒットするツールがあれば教えてください。 またバイナリコードが含まれているかどうかについて、数多くのファイルを一括して調べることが出来るツールがあれば教えてください。

  • VBでバイナリエディタを作成について

    VisualBasic6 SP5でバイナリエディタを作成しようとしているのですが、 例えばVariant型に格納したバイナリ文字列を16進表示で表示させたり、その逆の16進数を Variant型の16進数に変換するよい関数はありますか? また、バイナリエディタで良くある右側のテキスト表示ですが、ASCで表示させているだけでしょうか? よろしくお願いいたします。

  • MIDIファイルをバイナリ⇒16進コード変換したい

    どのような方法を用いれば、MIDIファイルのバイナリコードを 16進コードに変換できますか。 ネット上で検索したところ、Node.js を使う方法しか見当たりませんでした。 自前で javascript を使用して、.binaryToString() を用いましたが この方法では、変換された結果には 英単語と 文字化けした文字列が混在していて MIDIファイルの部分的な編集作業に利用することが 困難なようでした。 MIDIファイルの内容を text editor 上で手直しするために できれば javascript でバイナリコードを editor 上で読めるように 変換する方法をご指導いただけますでしょうか。 よろしくお願いいたします。 .

  • バイナリ出力

    バイナリのテストデータを作成しており、VBAで作成中です。 以下の内容で困っております。 「0~65525の値を2バイトの情報(VCでいうunsigned shortの型)としてバイナリファイルに出力する。」 変数long型で値を取得した場合、4バイトの情報としてバイナリ出力されてしまいます。これを2バイトの情報として出力する方法をご教授願えないでしょうか? よろしくお願いします。

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

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

  • Excelでセル内の文字列をバイナリ値として扱う方法はないでしょうか。

    Excelでセル内の文字列をバイナリ値として扱う方法はないでしょうか。 セルに貼付けた(エンコードされている)日本語URLをデコードしたいと思っております。 Unicode文字列はVBAからJScriptの関数を呼び出して対応しましたが、 長期的にはEUC-JPやその他の文字コードもデコードしたいと思っています。 手法は今も調べていますが現時点では、汎用的な関数を自作するしかないと認識しています。 そこで、 ADODB.Streamオブジェクトにバイナリモードでセルの値を書き込んだ後に、 テキストモードで任意のCharsetを指定してみたのですが、 セルの値は文字列として扱われ、バイナリ値として直接書き込めませんでした。 具体的には、EUC-JPでエンコードされた 「%a5%c6%a5%b9%a5%c8(テスト)」という文字列からReplace関数で「%」を除去し、 バイト型配列に代入した時点で、「a5c6a5b9a5c8」という文字列として扱われている という状態です(バイナリ値として入力されませんでした)。 上記以外のアプローチの仕方も含めて模索している状態です。 問題に対する考え方だけでもご指摘いただければと思います。 よろしくお願いします。

  • テキストデータをそのままバイナリへ

    初心者です。 テキストデータ(ASCII)として取り込んだ 「05 50 0E」 といった文字列を そのままバイナリデータ(16進)としての 「05 50 0E」 に変換したいのですが、こういった処理をする関数ってあるでしょうか? もしなければ作ってみたいのですが、その際の考え方や有用な関数などありましたら教えていただけると嬉しいです。

  • バイナリファイルとバイナリ文字列の違い

    がわかりません。 例えば >http://e-words.jp/w/E38390E382A4E3838AE383AAE58897.html をみるとバイナリ列は1バイトを連ねたものだというらしいです。 つまり【文】という文字列を文字コードUTF-8でバイト配列化すると [1] => 230 [2] => 150 [3] => 135 となります。 (これはPHPでunpackかけましたが他の言語のGetBytes()などでも同じバイト値がでました。) この【文】という文字列はバイナリ列になるわけですよね? 例えばこの【文】という文字だけを保存したbun.txtというファイルはバイナリーファイルに なるのでしょうか? バイナリファイルの定義をみると >http://e-words.jp/w/E38390E382A4E3838AE383AAE38395E382A1E382A4E383AB.html 上記URLだと >文字コードの範囲などを考慮せずに作成されたファイル というのがバイナリファイルであるとあります。 つまりバイナリファイルとは 1バイト・・つまり8ビット(0~255)までの数値で表したものを連ねたもので なおかつ、文字コードなどの解釈を一切行わなずに、バイト値のみが記述されたデータと おもってもよいのでしょうか?

  • 文字列を%+2桁のヘキサ

    の列に変換するPHPの関数はあるでしょうか? foo.php?x= の後につける文字列を作りたいのです ここに置けない文字列があると困るので変換しておきたいのです

    • ベストアンサー
    • 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