質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2540閲覧

RS232C通信でのサムチェック

entio

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/05/30 06:15

編集2019/05/30 08:19

RS232C通信を利用してテキストの送受信ができるプログラムを作っています。
環境はVMwareを使いwindows xpのコマンドプロで作成しています。
その中でサムチェックを行い誤り検出をしたいのですが、サムチェック関数がうまくつくれません。
入力したテキストデータ下位1バイトををASCIIコード2桁に変換するというものです。
自分なりに関数を作ってみたのでどこが悪いのか確認していただけらばなと思います

/*********************************************************************/ /* サム算出関数 */ /* IN: n サムチェック対象データのバイト数 */ /* *str サムチェックを行うデータ */ /* *sum サムを格納するポインタ */ /*********************************************************************/ void sum_check(int n,char *str, char *sum) { int i; int a; /* 16進データの格納エリア */ char sumbuf; /* サムチェック結果の一時保存用バッファ */ for(i=0;i<n;i++) { a = str[i]; /* strに格納されている16進を代入 */ sumbuf = sumbuf+a; } sum = sumbuf%100; /* サムの下二桁の表示 */ }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/05/30 07:08

コンパイルエラーなのでしたら, そのエラーもご提示ください. そしてそのエラーの何が分からないのかをお書きください.
entio

2019/05/30 08:15

返信ありがとうございます。 コンパイルエラー以前の問題で、 文字列の文字を16進数に変える方法が分からないのと、16進数の合計の出し方が分からないというものです。 例えば”AB”という文字列をサムチェックする場合、 Aの16進表示である0x41とBの16進表示である0x42 この合計を83H(hex)としてsumを求めたいのですがその方法が分からず困っています。
jimbe

2019/05/30 08:55

> 文字列の文字を16進数に変える方法が分からないのと、16進数の合計の出し方が分からないというものです。 つまり, ご質問の本質は 232C もチェックも関係無いのですね. そのようにご質問を編集頂くと良いかと思いました.
entio

2019/05/31 00:48

意見ありがとうございます。 質問されて分かりましたが確かに本質が違っていました。 修正または新規で質問させていこうと思います。 ありがとうございます。
guest

回答3

0

ベストアンサー

「どこが悪い」というよりは「なにやってるの?」と聞きたくなるような...

まず。関数の入力と出力をちゃんと定義してみて下さい。

入力したテキストデータ下位1バイトををASCIIコード2桁に変換する

チェックサムの話なら、「入力したテキストデータの各文字の和の最下位1バイトを...」かな。しかし、少なくともその関数は、ASCIIコード2桁を返すようにはなっていませんね。

Jimbeさんご指摘のように、10進数とか16進数とかいうのは数の表記の仕方の話でしかないので、少なくとも整数の計算においては気にする必要はないです。ooooo ooooo oo + ooooo ooooo は、0xc + 0xaと書こうと12 + 10と書こうと、ooooo ooooo ooooo ooooo oo になるでしょ。
だから、和を求める部分は特に考えることもなく、全データを足してしまえばいいです。

1バイトのデータsを2桁の16進で表記したいのなら、標準ライブラリを使うならsprintf()で、
char sumText[3];
sprintf(sumText,"%02X",s);
で出来ます。
16進の処理がちょっと面倒だけどこれぐらいは自力で書けたほうがいい、とは思いますが。

投稿2019/05/30 13:43

thkana

総合スコア7610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

16進数は単なる内部表現ですので, 加算時には16進数だからとか10進数だからとかは考慮する必要はございません.
c においては 'A' が char で表現(格納)され, 数値として扱うと 16進数では '42' であるというだけですので, 普通(?) に加算すればよいかと思います.
逆に「計算結果を下位1バイトにする」という箇所では, "1バイト"は 16進数の2桁ですから, この時に 16進数を意識する必要があります.
tacsheaven さんのご指摘通り, sumbuf%100; の 100 は 10進数です.

投稿2019/05/30 08:49

jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sumbuf % 100 は、sumbuf を 100で割った余り になりますから、下位1バイト(0~255)にはなるわけありませんね。

そもそも sumbuf が char ですから、(-128 ~ 127)の範囲の数値になっていますので、下位1バイトを取り出す意味もありません。(1バイトしかないのですから)

さらに、関数の引数が誤っています。ポインタでなくてはならないのにポインタになってません。コメントは正しく書かれているのですから、まずその意図はきちんと汲みましょう。

投稿2019/05/30 06:22

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

entio

2019/05/30 08:17

回答ありがとうございます。 初歩的な部分で間違えていました。修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問