文字列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進数長が
求められるようです。

このQ&Aに関連する最新のQ&A

A 回答 (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の値が返されます。

いかがでしょうか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q8進数から16進数への変換

8進数から16進数、また、16進数から8進数に
計算過程でほかの進数に変換することなく直接変換できますか?

Aベストアンサー

例:
8進の 324 を16進に。
32 と 4に分ける
32 を 2で割る → 15 あまり 0
あまり0なので、4はそのまま。
15を1 5 に分ける。
1を2で割る→ 0 あまり 1
あまり1なので、 5に+8する
0になったので終了。 答えは D4

等というように、ビットシフトと等価な計算はできます。
ただ、これを「他の進数に変換していない」と言っていいか微妙です。

それに、2進数にして区切りを変更する方が楽なのではないでしょうか。
324 → 011 010 100 → 0 1101 0100 → D4

Qname[3] = seq + '0';の意味

オライリーC実践プログラミングのP203、例13-11の例で質問です。
このプログラムでは一時的なファイル名を返す関数、tmp_nameがあるのですが
このプログラム中の以下の行がよく分かりません。
name[3] = sequence + '0';

直感的にsequenceだけでよさそうな気がするのですが以下のように書き直すと
出力結果にsequenceの数字がでずただ"tmp"と出力されるだけでした。
name[3] = sequence;


char型にint型を使うための手段なのでしょうか?
下記にプログラム全体を載せておきます。よろしくお願いします。

#include <stdio.h>
#include <string.h>

char *tmp_name(void)
{
static char name[30];
static int sequence = 0;

++sequence;

strcpy(name, "tmp");

name[3] = sequence + '0';
name[4] = '\0';

return (name);

}

int main()
{
char *tmp_name(void);

printf("%s\n", tmp_name());

return (0);
}

オライリーC実践プログラミングのP203、例13-11の例で質問です。
このプログラムでは一時的なファイル名を返す関数、tmp_nameがあるのですが
このプログラム中の以下の行がよく分かりません。
name[3] = sequence + '0';

直感的にsequenceだけでよさそうな気がするのですが以下のように書き直すと
出力結果にsequenceの数字がでずただ"tmp"と出力されるだけでした。
name[3] = sequence;


char型にint型を使うための手段なのでしょうか?
下記にプログラム全体を載せておきます。よろしくお願いします。

#incl...続きを読む

Aベストアンサー

これは、0から9までの数値をそれに対応する文字に変換するお手軽かつ問題のある手法です。

ご存知かもしれませんが、コンピューターでは文字は内部的には対応する数値で表されています。
ですから、C/C++ではchar形の中にあるのは文字ではなくその文字に対応する数値です。
したがって、
sequence + '0'
は0という文字を表す数値にsequenceを足した値になります。文字と数値の対応はたいてい0という文字の次に1, 2, ..., 9と続くようになっていますので、結果、sequenceが0なら0という文字を表す数値、sequenceが1なら1という文字を表す数値、…という値になります。
参考キーワードとして「ASCIIコード」を調べるといいでしょう。

数値から文字への変換がたった1回の足し算で出来る、とってもお手軽な方法ですよね?

でも、以下のように問題があるのであまり使わないほうがいい方法です。

・0から9までしか使えない
上で書いたとおり、この方法でsequenceが0なら0という文字に、1なら1という文字に変換できます。……では、sequenceが-1だったら?10だったら?

・そもそも前提に疑問が残る
文字と数値の対応はたいてい0という文字の次に1, 2, ..., 9と続くようになっています。……でもあなたの処理系で本当に連続して並んでいますか?将来そのように並んでない処理系への移植がないと100%言い切れますか?

これは、0から9までの数値をそれに対応する文字に変換するお手軽かつ問題のある手法です。

ご存知かもしれませんが、コンピューターでは文字は内部的には対応する数値で表されています。
ですから、C/C++ではchar形の中にあるのは文字ではなくその文字に対応する数値です。
したがって、
sequence + '0'
は0という文字を表す数値にsequenceを足した値になります。文字と数値の対応はたいてい0という文字の次に1, 2, ..., 9と続くようになっていますので、結果、sequenceが0なら0という文字を表す数値、sequenceが...続きを読む

Q2進数から16進数への変換、あるいはその逆について

はじめまして。
高校の情報の授業で「2進数・10進数・16進数」を勉強しています。
どうしても2進数から16進数への変換、あるいは、16進数から2進数への変換の方法がわかりません・・・

初心者でも分かりやすい解説をお願いします。

Aベストアンサー

2進数の各桁を、右から4桁毎に区切って、その4桁を右から1,2,4,8という具合に割り当てます。
その4桁を、16進数の1文字に対応させて、そのまま置き換えるだけです。
これを、2進数の4桁毎に、繰り返せば複数桁の16進数になります。

逆に、16進数を2進数にする場合は、16進数を1桁ずつに分解し、それぞれを2進数4桁に置き換えて、全体を繋げれば完成です。

2進数:16進数:中身
0000=0=0そのまま
0001=1=1そのまま
0010=2=2そのまま
0011=3=2+1
0100=4=4そのまま
0101=5=4+1
0110=6=4+2
0111=7=4+2+1
1000=8=8そのまま
1001=9=8+1
1010=10=8+2
1011=11=8+2+1
1100=12=8+4
1101=13=8+4+1
1110=14=8+4+2
1111=15=8+4+2+1

Qg += a[i];の+=の意味とは

/* 合計点を求る*/
g = 0;
for (i= 0; i < 10; i++)
{
g += a[i];
}
以上ですが、g += a[i];の+=とはどんな意味なのでしょうか?
 よろしくお願いいたします。

Aベストアンサー

代入演算子の一種で、その左辺にある変数に、右辺にある値を加算します。
とりあえず処理としては
 g = g + a[i];
と同じ結果になります。
https://msdn.microsoft.com/ja-jp/library/5bk6ya5x.aspx

なぜ
 g = g + a[i];
でいいのにそんな書き方があるのかいうと、これだと「g の値を g に a[i] を足した値にする」という意味になるのに対して
 g += a[i];
だと「g に a[i] を足す」と意味が簡単になるためです。
……まあ、それ以外に歴史的・機械語的にこっちの方が速いという意味もあったんですが、最近のコンパイラはそのあたりを最適化するので左記の意味は薄れています。

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

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

Aベストアンサー

その温度計のメーカーには問い合わせしたのでしょうか
サンプルとかはないのですか

たとえば "GET" といった文字列を送りたい場合
どのように変換したものを送ればいいのかなど

"GET" を "474554"といった文字列に変換して送信なのか
『474554』といった文字列が必要なら

dim bld as new System.Text.StringBuilder
dim ss as string
for each _byte as Byte in AryByte
  bld.Append( String.Format( "{0:X2}", _byte ) )
next
ss = build.ToString
SerialPort1.Write( ss, 0, ss.length )
といった具合でよさそうですが

メーカのWebページなどにその機器の使い方のサンプルがあるなら
明示してみるといいかもしれませんよ

Qfp = fopen(argy[1], "r");の[1]の意味は

https://oshiete.goo.ne.jp/qa/8940272.html
 の11行目に
fp = fopen(argv[1], "r");の[1]の意味が分かりません。
試したいのですが、ソフトがうまく動きません
 よろしくお願いいたします。

Aベストアンサー

前の例題も読みました。

大分苦戦しているようですが、配列については理解が進みましたでしょうか?
お答えしますと、最初のパラメータ文字列が代入されています。

古いC言語の約束でして大変有名なものです。

コマンドラインコンソールから実行ファイル名を書いて、
パラメータをスペースで区切って指定したとします。

このパラメータ文字列が[1]以降に入ります。
例として、"test"と言う名前の実行ファイルがあったとします。

例)> test test1 test2 3 4

このようにコマンドラインから入力し実行すると、

argc = 5
argv[0] = "test"
argv[1] = "test1"
argv[2] = "test2"
argv[3] = "3"
argv[4] = "4"

と文字列が入ってきます。

以下はサンプル。

void main( int argc , char *argv[])
{
if( argc < 2 )
{
// パラメータ指定がなかった場合の表示
printf( "test に続けて4つまでパラメータを入力できます\n");
exit(0);
}
if( argc > 5 )
{
 // パラメータが5つ以上あった場合の表示
printf( "5つ以上のパラメータは受け付けません\n");
exit(-1);
}

// 正常ルート
printf( "パラメータの数は%d個ですね?ニヤッ\n", argc-1);
printf( "最初のパラメータは%sでしょ?\n", argv[1]);
printf( "残りはargv[2]以降ですが、面倒なので表示しません\n");
}

と言う具合に、引数を活用できます。argv[0]には、実行ファイル名が入ります。
argc は実行ファイルの名前も含めてカウントされます。

プログラムによっては必要な引数の数が変わりますし、
ユーザーのコマンドラインからの入力ミスなどでパラメータがなかったり、
必要なパラメータが不足していたりしますので、
argcとargvを使って最初にシンタックスエラーチェックをするのが常道です。

実行ファイル名の指定がなく、プログラムが実行されることはないと思われます
から、argcは1以上の値になります。

argc, argvの活用は、
実行コマンドを手打ちで打ち込むコンソール形式でよく用いられる基本的な
アプリケーションの開発手法です。

ご質問の箇所は、
第一パラメータにプログラム内で読み込むファイルのファイル名を指定してるの
でしょう。(よくあります)

しかし、Windowsなどのウィンドウを使用するアプリケーションは、
これとは違っておりますので注意が必要です。
(C言語とは別に、Windowsに特化した開発ノウハウの勉強が必要です)

Windows系で上記の様な基本的なプログラムを作成する場合は、
プロジェクトの作成時に(VisualStudioなどで)コンソールアプリケーション
を選んで作成します。実行時にコンソールが開きます。

Linuxの場合は、コンソールがデフォルトになっているでしょうから、
(特殊な設定がなければ)そのまま作成できます。

テキストエディタでソースを記述し、gcc などでコンパイルします。
実行形式ファイルが出来ていれば、想定どおりの動作をするでしょう。

ファイルの読み込みが出来るようになったら、
ファイルの内容を書き換えて保存したり、
ファイル名を変えたり、
ディレクトリ内のファイルを全て表示したり、
ファイル内に含まれる文字列を検索し、該当するファイルをリストしたりなど、

有用なサンプルプログラムを沢山作って練習します。

ファイルを読み込む先は、char型の配列でバイトサイズのメモリーとして確保
します。メモリーと変数の関係を充分に理解することをお勧めします。
殆どのプログラムは、このメモリーの確保やメモリーサイズの計算と格闘する
場合が多くなるからです。

バイナリー形式のファイル(すべてはバイナリー形式として良いのですが)に
ついて理解が深まった後は、
bmpの画像ファイル、wavなどの音声ファイルをあけて、
これの中身を書き換えて遊びます。

特にwavファイルは、音量の変更や周波数フィルタなども掛けれますので、
メモリ、配列、ファイルの関係を(焦らずに)ゆっくり理解するだけで、
今の知識レベルでも面白いことが沢山出来ます。

以上、ご参考に成れば。

前の例題も読みました。

大分苦戦しているようですが、配列については理解が進みましたでしょうか?
お答えしますと、最初のパラメータ文字列が代入されています。

古いC言語の約束でして大変有名なものです。

コマンドラインコンソールから実行ファイル名を書いて、
パラメータをスペースで区切って指定したとします。

このパラメータ文字列が[1]以降に入ります。
例として、"test"と言う名前の実行ファイルがあったとします。

例)> test test1 test2 3 4

このようにコマンドラインから...続きを読む

Q16進数を10進数に簡単に変換する関数は?

16進数を10進数に簡単に変換する関数は何かありますか?
もしご存知でしたら教えていただけないでしょうか?

例えば、3BDF8という16進数を10進数に変換したいと思っています。

Aベストアンサー

C言語のプログラム内では、保持している数値にn進数という概念はなく
文字列化するときに初めて考えるものです。

int n; // <- このnは何進数でもない

ご質問を以下のように解釈してサンプルを書いてみました。

例えば、3BDF8という16進数(の文字列)を10進数(の文字列)に変換したいと思っています。


$ cat test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
int num;
sscanf(argv[1], "%x", &num);
printf("%d\n", num);
}

$ ./a.out 3BDF8
245240

いかがでしょうか。

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

Qchar *(*)[3];について

#include <iostream.h>
main(){
char *(*pp)[3];
printf("%lu", sizeof(char*));
printf(" pp%lu", pp);
printf(", ++pp%lu", ++pp);
}

これを実行して
4 pp6660000, ++pp???????
のように表示されたときに、???????の部分が何になるか考えました。
ppはchar[3]を指すポインタのポインタだから、ppをインクリメントすれば、「char[3]を指すポインタ」の大きさだけ大きくなるはずだから、「char[3]を指すポインタ」の大きさである4バイト大きくなるはずだから
4 pp6660000, ++pp6660004
になると思いました。
どこを勘違いしていてどう考え直せばよいか教えて下さい。

Aベストアンサー

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//ppc3 は、char[3]を指すポインタのポインタ
ppc3=&pc3;
printf("%p\n",ppc3);
ppc3++;
printf("%p\n",ppc3);//+4(ポインタサイズ分)される

return 0;
}

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//p...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング