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;
}
※変換の仕組みを分かりやすくするようにループは使っていません。
ヘキサコードは16進文字列のことです。
言葉足らずで申し訳ありません。
サンプルコードを参考にさせて頂いています。
ありがとうございます。
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
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;
}
以上。参考に。
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" );
★なんのチェックもせずに、ひとつおきにコンソールに出力してるだけです。
No.5
- 回答日時:
★回答者No.2です。
・『strtoul』の存在をすっかり忘れていました。
これを使えば一発です。
・下の『参考URL』をどうぞ。
参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtoul.html
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
この回答への補足
ヘキサコードの文字列は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 …
にも似たような事を書いてますし・・・
このやり方も調べてみようと思います。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 写真の色分析 3 2023/04/16 11:32
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- Excel(エクセル) バイナリー演算を勉強したい 1 2023/04/19 14:17
- Excel(エクセル) 【VBA】PDF出力に任意のファイル名前を付ける方法 3 2023/07/21 10:55
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- その他(Microsoft Office) Excel 2列の値を返す数式についてです 1 2022/11/23 22:59
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Excel(エクセル) エクセルのマクロを教えてください。 1 2022/03/30 09:29
- Excel(エクセル) Excel ある複数列に数値を入力した際に、別の列に本日の日付を入力したいです 7 2023/03/01 23:31
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
ふりがなをアルファベット化す...
-
「彡」って文字はなんという文...
-
ExcelVBA実行後に時々落ちる
-
英数字を含む文字列(0-9,A-Z)...
-
sedで日本語の置換方法について
-
2バイト文字をJEFからSJISに変...
-
Symfowareでのデータ型変換につ...
-
画像ファイル等→16進
-
Excel vba で1と10を正確に判断...
-
友人とのラインで 「~MBと書く...
-
Perlコードを、自動的にPHPコー...
-
C言語でUTF-8コードで読み込ん...
-
HP-UXでの文字コード変換方法
-
Webブラウザから入力する漢字コ...
-
繁体字の文字コード?変換
-
ビット反転(Not)が機能しない
-
C#で16進数からASCIIへの変換の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
「彡」って文字はなんという文...
-
std::stringからLPCWSTR型への変換
-
VS 2008(VB.NET)
-
ExcelVBA実行後に時々落ちる
-
ふりがなをアルファベット化す...
-
Excelマクロにて30分単位の計算...
-
Symfowareでのデータ型変換につ...
-
英数字を含む文字列(0-9,A-Z)...
-
JIS → S-JIS コード変換するには
-
sedで日本語の置換方法について
-
COBOLによる全角・半角混...
-
フォームのコントロールのバッ...
-
数字5桁文字コード?
-
バイナリデータ→ASCII 変換プ...
-
2バイト文字をJEFからSJISに変...
-
VBScript ASC関数:文字エンコ...
-
CString ←→ BSTRの変換について
-
入力した文字を全て自動で全角...
おすすめ情報