プロが教えるわが家の防犯対策術!

ヘキサコードの文字列をバイナリに変換する事ができずに困っています。

ヘキサコードの「31 32 33」という値を持っていれば、
ファイルに出力した時に、
「1 2 3」と出力するようにしたいと思っています。

何か関数が用意されていたりしないでしょうか?
宜しくお願いします。

環境
windows xp sp2
VC++2005

A 回答 (9件)

★もしかして?


・ヘキサコードとは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;
}
※変換の仕組みを分かりやすくするようにループは使っていません。
    • good
    • 0
この回答へのお礼

ヘキサコードは16進文字列のことです。
言葉足らずで申し訳ありません。

サンプルコードを参考にさせて頂いています。
ありがとうございます。

お礼日時:2008/01/31 12:39

下記のURLをご紹介しておきます。


この中の、makeString() という関数が、そのような働きをします。
引数として桁数が必要ですが。

char src[] = "313233";
char dest[4]
であれば、
makeString(src, dest, 3);
で、dest[] に "123" が入ります。(最後の '\0' は付加しません)

処理内容はすでに回答されているものと同じです。

参考URL:http://www.nest4.net/tec/strnum.html
    • good
    • 0

★回答者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;
}
以上。参考に。
    • good
    • 0

No6です。



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

No2さん申し訳ない。
    • good
    • 0

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" );
★なんのチェックもせずに、ひとつおきにコンソールに出力してるだけです。
    • good
    • 0

★回答者No.2です。


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

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtoul.html
    • good
    • 0

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

    • good
    • 0

>ヘキサコードの文字列をバイナリに変換する事ができずに困っています。



☆ちょっと整理(「ヘキサコードの文字列」って何?)
 コードの対象は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

この回答への補足

ヘキサコードの文字列は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/slide1 …
にも似たような事を書いてますし・・・
このやり方も調べてみようと思います。

補足日時:2008/01/31 13:19
    • good
    • 0

そのヘキサコードを格納しているのは 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に数値化されたデータを取得出来ます
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!