16進数変換とは?

このQ&Aのポイント
  • 16進数変換は、文字列16進数をバイナリ16進数に変換する処理です。
  • 具体的には、文字列16進数内の各文字を大文字に変換し、2文字ずつ組み合わせてバイナリ16進数に変換します。
  • バイナリ16進数とは0から15までの数字を表す4ビットの2進数の組み合わせであり、データの表現や処理に使用されます。
回答を見る
  • ベストアンサー

16進数変換

文字列16進数をバイナリ16進数に変換する参考ソースが以下のようになっていたのですが、どういう意味でしょうか? strSerial ..... 文字列16進数 ForwardBuf ..... char BackBuf .....char /* 文字列16進数長を代入 */ Len_strSerial = strlen(strSerial); /* 文字列16進数を大文字に変換 */ for (iToupCnt=0; iToupCnt < Len_strSerial; iToupCnt++) { tmpbuf[iToupCnt] = toupper(strSerial[iToupCnt]); } for (iStrsCnt = 0; iStrsCnt < Len_strSerial; iStrsCnt += 2) { ForwardBuf = (tmpbuf[iStrsCnt] >= 'A' ? tmpbuf[iStrsCnt] - 'A' + 10 : tmpbuf[iStrsCnt] - '0'); BackBuf = (tmpbuf[iStrsCnt + 1] >= 'A' ? tmpbuf[iStrsCnt + 1] - 'A' + 10 : tmpbuf[iStrsCnt + 1] - '0'); binSerial[iBSLCnt] = ForwardBuf * 16 + BackBuf; iBSLCnt++; } ちょっと見にくいですね・・・すみません よろしくお願いします ちなみに最終的にはバイナリ16進数とバイナリ16進数長が 求められるようです。

  • sting
  • お礼率12% (35/274)

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

  • ベストアンサー
  • wogota
  • ベストアンサー率42% (66/154)
回答No.1

もしかしたら、3項演算子の部分でしょうか、ほかのルーチンに関しては コメント文がありますので。 3項演算子は、(a)?(b):(c)の形であらわされ、(a)は条件式、(b),(c)は 計算式と考えるといいでしょう。(a)は正の場合、(b)が、負の場合(c)が 与えられるということです。 if文を用いると、x=(a)?(b):(c)は、 if( (a) ){ x=(b);}else{ x=(c);} と書き換えられます。 ここでは、文字のアスキーコードが'A'以上ならば、アスキーコードの値から -'A'+10とすることで、10から15の値が返されます。そうでないなら、 アスキーコードの値から-'0'とすることで、0から9の値が返されます。 いかがでしょうか?

関連するQ&A

  • お願いします、教えてください。10進数を2進数に変換するには・・・。

    10進数を2進数に変換するプログラムを作成したのですが、うまく動作しません、どうしても解らないので教えてください。 サンプルコードを元に「define」は5で稼動出来る様にしたいのですが、動作せず困っています。以下の、どの部分を修正すれば変換出来るのでしょうか? ご教授よろしくお願いいたします。 //10進数文字を数字の2進数で表示 #include "stdafx.h" #define HEX 5 //「function」:入力文字された文字の処理///////////////////////////////////// char ToInt( char cInt) { int mal=0; switch (cInt){ case '0': mal=0; break; case '1': mal=1; break; case '2': mal=2; break; case '3': mal=3; break; case '4': mal=4; break; case '5': mal=5; break; case '6': mal=6; break; case '7': mal=7; break; case '8': mal=8; break; case '9': mal=9; break; } return (mal); } //「function」:入力文字された文字数//////////////////////////////////////////// char HexInt( char eInt) { char mul=0; switch (eInt){ case 0: mul='0'; break; case 1: mul='1'; break; } return (mul); } //「function」:桁数の計算(10×指数を計算)/////////////////////////////////// int HexAcc( int n ) { int i; int ans=1; for( i=0; i<n; i++ ){ ans *= 10; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,s=0,k=0,m=0,e=0,ans=0, add=0; char decimal[255], ditto[255],sub[255],temp[255],chg[255],siu[255]; //入力されない場合// if( 1 > argc ){ } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k<255; k++ ){ //文字として'0'を代入// sub[k] = '0'; //subに文字として'0'を代入// temp[k] = '0'; //tempに文字として'0'を代入// chg[k] = '0'; //chgに文字として'0'を代入// siu[k] = '0'; //siuに文字として'0'を代入// } //入力された文字数を受取る// for( i=0; argv[1][i] != '\0'; i++ ){ decimal[i] = argv[1][i]; } decimal[i] = '\0'; //空白文字のチェック// for( i=0; decimal[i] != '\0'; i++ ){ if( decimal[i] != ' ' ){ ditto[n] = decimal[i]; n++; } } //'\0'を代入(文字列の終端)// ditto[n]='\0'; //「0」から「9」のループ// for( n=0; ditto[n] != '\0'; n++ ){ if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' ) || ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' ) || ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){ }else{ printf("エラー\n 10進数を入力してください。\n"); return 0; } } //桁数のループ// for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } //桁数の判断// if( m <= HEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",HEX); return 0; } //subにdittoを代入// for( n=0; ditto[n] != '\0'; n++){ sub[HEX-m+n] = ditto[n]; } sub[HEX] = '\0'; //'\0'を代入(文字列の終端)// //sub[0]からsub[9]の計算// for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(HEX-n-1); } //2進数の計算・商が0になるまで// for( n=0; sub[n] != '\0'; n++ ){ temp[n] = add % 2; add = add / 2; if( add == 0){ break; } } temp[HEX] = '\0'; //'\0'を代入(文字列の終端)// //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } //temp・値の入替え「tempからchg」// for( n=0; sub[n] != '\0'; n++ ){ chg[HEX-n-2] = temp[n]; } chg[HEX]='\0'; //'\0'を代入(文字列の終端)// //2進数に変換// for( ; n>=0; n-- ){ siu[n] = HexInt(chg[n]); } siu[HEX]='\0'; //'\0'を代入(文字列の終端)// printf("\n10進数文字を2進数で変換した値は・・・ %s \n",siu); }

  • 2進数から10進数変換

    int henkan(char [ ]) という関数に、”10111”と 2進数で表記されている文字列を数値に変換したいんですが、 どうやったらよいのか教えてください。

  • 大文字⇔小文字の変換

    大文字⇔小文字の変換をしたいのですが、tolowerやtoupperを使わずにしたいのです。 「a」は16進数で61 「A」は16進数で41 なので20を引けば変換できると思うのですが、可能でしょうか?

  • 10進数の2進数文字列変換

    10進数の2進数文字列変換 ◆開発環境 OS:Linux(Ubuntu9.10) コンパイラ:gcc4.4 言語:C ◆質問内容 ポインタ*Aに格納されている10進数を2進数の文字列に変換し、 文字配列Bに格納したい。 バッファとして*fpを準備。 webで調査した結果を以下のソースのようにアレンジしましたが、 fputc関数の処理で、プログラムが強制終了してしまいます。 何か、良い方法ございませんでしょうか。 ◆サンプルソース void Dec_conv_bit(long *A,char *B){ unsigned int bit,n; //ビット比較用 unsigned int *fp = &n; n = (unsigned int)A; for(bit = 1 << sizeof(int)*8-1; bit > 0; bit >>= 1){ fputc((n & bit)?'1':'0',fp); } sprintf(B,"%s",fp); //putchar('\n'); }

  • 3進数を10進数に変換

    3進数や5進数のように2の階乗ではない任意の進数の文字列を、C言語のビットシフトを使って10進数に変換するプログラムについて、質問させていただきます。 ビットシフトを使わないで、任意の進数の文字列を10進数に変換する方法は分かっていますが、ビットシフトを使った方が非常に計算が高速で出来るので、ビットシフトを使いたいと思っています。 下記のプログラムは4進文字列を10進整数に変換するものです。2進、8進文字列の場合は、シフトするビット数を1ビット、3ビット(つまり、ans <<= 1、ans <<= 3)にすれば計算することが可能です。しかし、3進数や5進数の場合、いろいろと考えたのですが、どのようにすれば良いのか分かりません。 下記のプログラムのようにビットシフトを使って3進数や5進数の文字列を10進数に変換するには、どのように工夫すれば良いでしょうか? どなたかご教授をお願いいたします。 #define STRING_NUM 2 /* 文字列の長さ */ int main(void) { int i; int ans = 0; /* 10進数の整数 */ char buf[STRING_NUM]; /* 4進数の文字列 */ buf[0] = '3'; buf[1] = '1'; for ( i = 0 ; i < STRING_NUM; i++ ){ printf(" %c", buf[i]); } printf("\n"); for ( i = 0 ; i < STRING_NUM; i++ ){ if ( buf[i] == '0' ){ ans <<= 2; /* シフトするビット数 */ ans |= 0; } if ( buf[i] == '1' ){ ans <<= 2; ans |= 1; } if ( buf[i] == '2' ){ ans <<= 2; ans |= 2; } if ( buf[i] == '3' ){ ans <<= 2; ans |= 3; } } printf( "ans = %d\n", ans ); return 0; }

  • シーザー暗号(C言語)

    シーザー暗号というものを作ろうとしていますが、文字のずらし方がわからず詰まっています。 手順は一応考えてあります。 (1)入力された文字を配列input[301]に代入 (2)何文字ずらすかを指定してその数値を変数countに代入 (3)入力された文字の長さを変数lenに代入 (4)inputとcountとlenを、文字をずらしてそれをoutputに返す関数shiftに渡す (5)outputを表示する のような感じですが、肝心の文字のずらし方がわかりません。 JISコードを使ってやるといいと聞いたんですが、そのやり方がわかりません。 ソース↓ #include <stdio.h> #include <string.h> int shift_char(char x[], int y, int z) { int i; for(i = 0; i <= z; i++) { x[i] = x[i] + y; } return x; } int main(int argc, char* argv[]) { char input[301]; char output[301]; int count, len, i; printf("文字を入力してください: "); scanf("%s" ,input); printf("何文字ずらしますか: "); scanf("%d" ,count); len = strlen(input); output = shift_char(input, count, len); for(i = 0; i <= len; i++) { printf("%s" ,output[i]); } return 0; } よろしくお願いします。

  • 16進数から2進数への変換

    「Aレジスタに一文字のアスキーコードがあり、これを以下のように二進数に変換してBレジスタに代入する」 Aレジスタ='0’のとき、Bレジスタ=00000000B Aレジスタ='A’のとき、Bレジスタ=00001010B この例題に苦戦してます。。 16進数を2進数に変換するアセンブリ言語を教えてください!!

  • 計算機言語(C言語)の課題です。

    ポインタstrが文字列の先頭文字を指している時、その文字列に含まれる英小文字を英大文字に変換する関数 void str_toupper(char *str) を作成しなさい。ただし、英小文字a~zおよび英大文字A~Zには、それぞれ昇順に、連続した1バイトの整数が割り当てられているものとする。例えば、aには10進数の97、zには10進数の122が割り当てられ、Aには10進数の65、Zには10進数の90が割り当てられるといった具合である。

  • 数値から2進数の文字列変換

    ある数値を2進数の文字列に変換したい関数を作りたいのですが、うまく出来ません。 2進数表示させるのに、シフト演算を使いたいのですがうまくいきません。 ヒントでもいいのでおしえてください。 ↓いちよう作ろうとしているプログラムです。 char *a(int atai){ int amari; char moji=0; while (atai != 0) { amari = atai % 2; atai = atai / 2; /*2進数表示させたい*/ } return moji;

  • 10進数を16進数に変換

    c言語で文字列に含まれる10進数部分を16進数に変換する方法を教えてください。  sdkk161h→sdkkA1h 161 →  A1

専門家に質問してみよう