• ベストアンサー

CRC(チェックサム)のASCIIコードについて

現在装置を外部PCから操作させる設定の一覧を作成しています。 メーカーからの指定は、設定したい数値を(16進数) 40 NN NN NN CRC  をASCIIコードで入力するように指定されています。 例えば、50に設定したい場合は @050* (40 30 35 30 2A) と入力します。 ここで、CRCがASCIIの制御文字(00~1F)に該当してしまう場合、どのように CRCを設定するか分からずにいます。 このような場合は、どのような設定をするものなのでしょうか?

  • zart_
  • お礼率85% (6/7)

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

  • ベストアンサー
  • ryos14qs
  • ベストアンサー率35% (5/14)
回答No.2

補足が付きましたのでもう少し。 補足のような仕様だとするならば、 CRCを入力する必要が無いです。 そもそもCRCはチェックサムですから、それを入力したらCRCの意味がありません。 (CRCを入力間違えしたらおしまいですから) 通常は以下のように 入力は@099とだけ入力し、PC内で入力からCRCを計算します。 入力にCRCを付加して5バイトのデータ(0x40,0x30,0x39,0x39,0x1D)として 装置に転送すればよいだけだと思います。 受信側では同様に受信データを4バイト分加算しNOTして、 受信したCRCと計算したCRCが合致するかチェックします。

zart_
質問者

お礼

返信が遅くなり申し訳ございません。 本日は装置を触ることができないので、明日に早速試してみたいと思います。 とても助かります。 ありがとうございました。

その他の回答 (1)

  • ryos14qs
  • ベストアンサー率35% (5/14)
回答No.1

質問者様の文だけではメーカからの意図がはっきりしませんが ASCIIコードで入力しろといっているので 403035302A で良いのじゃないの? @050* だとASCII文字になっちゃうけど?

zart_
質問者

補足

説明不足ですみません。 コードと文字が混同していました。 文字で入力するように指定されています。 ですので、50を入力したい場合、16進数で書きますと 40←メーカー指定の数字 30←0 35←5 30←0 2A←CRC となり、ASCII文字の@050*を入力するようになっております。 また、CRCの計算は@505の部分の和を2進数に直し、bitを反転した物になります。 このCRCの部分が、例えば99を入力させたいとなると 「40 30 39 39 1D」となり この1DがASCII文字ではグループ区切りで文字で表すことができないので、一般的には どのようにしているのか知りたく、質問させて頂きました。 以上、よろしくお願いいたします。

関連するQ&A

  • UTF-8とASCIIコードにおける互換性について

    UTF-8とASCIIはそのASCIIコードの範囲のおいて 互換性を持ちます。(と、書籍や多種な文献にはそういった記述があります) たとえば【A】という文字をUTF-8で符号化した際は【41】(16進数で) さらにASCIIコードでも【41】という値がAという文字に割り当てられています。 確かに、一件互換しているようにみえますが、UTF-8っていうことは最終的には Unicode上のコードポイントの値・・・つまり0x0041という値に復元?(というのでしょうか)するわけですよね? でそのUnicodeの文字集合上から復元したコードポイントに対応する文字を参照しAという文字をみつけてくると・・・。 これって【A】という文字をUTF-8で符号化した歳のバイト列はASCIIと一致しているけれど 結局Unicodeコードポイントに直した場合【00】という上位バイトが無駄にくっついてきて【0x0041】となり 互換性がなくなるのではとおもったのですが・・・。 これはどういう意味の互換性なのでしょうか? 識者の方ご教授ください。 お願い致します。

  • ASCII文字列をEUCなどに変換したいができない

    いつもお世話になっております。 ファイルの文字コードがEUCのファイルの中に、 なぜか、文字コードがASCIIである文字列があります。 この文字列は、外部から受け取るカタチなので、 これはこれで、ASCIIでも、しかたないのかなという風に思い、 それならば、受け取った後、EUCに変換すればいいやと考え、 mb_convert_encoding($var,"EUC-JP","ASCII")を使って、変換を試みるも、 ASCIIのままなのです。 ASCIIである文字列には、変換されない鉄壁さというものがあるのでしょうか? 変換処理後に、mb_detect_encoding()で検査しますが、やはりASCIIのままです。 それならば!、ということで、 受け取る値(ここでは例として、"This_Value_is_ASCII_Encoding_hogehoge9999")を いったん手動のコピペ操作をして、 $UketoruAtai = "This_Value_is_ASCII_Encoding"; とし、 その値もやはり、ASCII文字列になっているので、 この、手動コピペ文字列ならば文字コードの変換はできるだろうと思い、 上記のmb_convert_encoding()の処理をしたわけですが、 この場合でも、やはり ASCIIは鉄壁でした。 いったい、これは、なんなんでしょうか、、、。 ちなみに、このASCII文字列は、英数字のみ(当たり前か。笑)の文字列です。 このASCII文字列を、EUC-JPにする手助けを、どなたか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ASCIIコードについて

    先日、仕事でシリアルケーブルで接続されているPC~装置間にラインモニタをセットし、通信電文を調査したところ、「31B9AEB5」となっており、装置上には「19.5」と表示されていました。対応として、 0x31=1 0xB9=9 0xAE=. 0xB5=5 のようになっているようです。ASCIIコードだと考えると「0x31=1」は納得するのですが、「0xB9=9」以降が良くわかりません。上記データから0x80を引くと「0x39」「0x2E」「0x35」となり、ASCIIコード表のデータに一致します。 そこで質問なのですが、上記の場合「0xB9」「0xAE」「0xB5」はASCIIコードなのですか?ASCIIコード表など見てみると0x00~0x7Fの表はよく見かけます。ちなみに、このプログラムは海外で作られたようで、日本で言う「JIS」のようなコードなのでしょうか?

  • CRCの検定コードがどの文字でも同じになった!?

    C言語の初級者が質問します。 講義の課題で、「伝送誤り検出方式として巡回符号方式(CRC:Cyclic Redundancy Check)を使用した場合、送り側でアルファベット6文字の適当な単語を1文字ずつ入力した場合の検定コードを算出しなさい。生成多項式はCRC-16-CCITT(Xの16乗)+(Xの12乗)+(Xの5乗)+1を使用し、検定コードは2byteとする。 この課題に対し、一文字ずつ、検定コードを求めて合計6個の和を出して16進数で表現しようと考え、以下のプログラムを作りました。#include <stdio.h> #include <string.h> #include <stdlib.h> int main () { int t,s,i,m; int l; int flag; int crcReg[10]; // crcRegは一文字ごとのCRCの計算途中過程 res[]は一文字ごとのCRCの最終結果 char inData[6]; //文字列入力 int jyuroku[6]; int crcmax; printf("文字入力(6文字まで):"); gets(inData); // l=strlen(inData); for(i = 0;i < l; i++) { printf("%d番目は16進数で%X\n",i+1,inData[i]); // } printf("各文字の16進asciiは(0x必要か?)"); for(m = 0;m <l;m++) { printf("%d番目のascii:",m+1); scanf("%X", &jyuroku[m]); // } //**********************************(後半)********************************************** for(s=0;s < l; s++) {//文字の数だけ繰り返し crcReg[s]=0xFFFF; //CRCの初期値はどの文字の場合でも同じ printf("%d 番目の16進ascii:%X\n",s+1,jyuroku[s]); // for (t = 0;t < 8; t++) { //入力する16進数は8ビット=1バイト ゆえ8回繰り返し flag = (crcReg[s] ^ jyuroku[s] & 0x01); // 生成多項式をかけるかどうかの判定の前段階 crcReg[s] = crcReg[s] >> 1; //CRCの計算過程を1ビット右にシフト if (flag == 0x01) { //最下位ビットflagが1の時の処理 crcReg[s] = (crcReg[s] ^ 0x8408); //生成多項式は10進数で } else if (flag == 0x00) { } jyuroku[s] = jyuroku[s] >> 1; // asciiコードも1 ビットシフト } printf("CRCの結果は%X\n",crcReg[s]); // } crcmax = crcReg[0]+crcReg[1]+crcReg[2]+crcReg[3]+crcReg[4]+crcReg[5]; printf("\n kekka:%d",crcmax); // return 0; // } しかし、こうするとcrcReg[s](検定コード)がどの文字の場合でも同じ255(16進数ではFF)になって、6文字の単語は常に和が1530になってしまいます。255=16の2乗-1であることが問題解決の鍵だと思うのですが、何か問題点わかりますか?

  • command.comとASCIIコードについて

    command.comとASCIIコードについて質問させて下さい。 もし御存じであれば以下について御回答いただけないでしょうか。 例えば、 キーボード上「 あ」・「 い」・「 う」・「 え」・「BS」・「 ←」というキーがあり そしてそれに対応するASCIIコードが それに対応して「a1」・「a2」・「a3」・「a4」・「b1」・「b2」となっていたとします。 その時、「あ・い・う」というコマンドを入れたかった場合に 「え・い・う」と間違えて入力してしまった場合、command.comにはENTERが押された時点で「a4・a2・a3」という命令がされることになるのですか? その後で、「a1・a2・a3」に直したいとき「BS」で戻るというのは「BS」の「b1」というコードが 「a4・a2・a3・b1」と入るわけではなく、直接command.comの入力用バッファが 「a4・a2」となってしまうということになるのでしょうか? それとも、やはり「a4・a2・a3・b1」となっているんだけどディスプレイ上「え・い」となっているということなのでしょうか? それに対して「 ←」キーは異なる動作をするということなのですか? それとも、もともと「b2」というコードはなくて「 ←」と入力されたときは 「BS」と入力されたものと同じ処理をするということになるのでしょうか? 質問の意図が取りにくいかとは思うのですが、是非お答いただけたらと思います。どうか宜しくお願いします。

  • CRC16コード作成プログラムについて

    お世話なります。 PCと対象機械との通信を行おうと思っております。 内容としてCRC16のコードを使って、日時設定をPC→対象機器へ行いたいです。 CRC16の生成プログラムをいろいろ調べてみたところ、 今、自分のスキルでなんとかわかりそうなCRC16のソースが次の通りでした。 (行列の計算ぐらいならC言語で作れる程度です。。。) unsigned short crc_cal(unsigned short lng, unsigned char *str) { unsigned short crc, i, j, t; crc = 0xffff; for (i = 0; i < lng ; i++) { crc ^= (unsigned short) str[i]; for (j = 1; j <= 8; j++) { if (crc & 1) { // carry bit on crc = crc >> 1; crc ^= 0xa001; } else { // carry bit off crc = crc >> 1; } } } return crc; } “0C0C0C0C0C0C”と入力したら、CRCコードが算出されるプログラムを作りたく、 入力部分を作成してみたのですが・・・ int main(void) { unsigned short i,j, t; unsigned char str[256]; unsigned char str0; unsigned short crc; int k=0; printf("Please input key (HEX)\n"); for(k=0; k < 256; k++) { scanf("%c",&str0); // 文字列標準入力 if( str0=='\n') // Enterが押されたときの実行 { str[k]='\0'; // 文末にNULL文字 break; // for文のループ終了 } else { str[k]=str0; // NULLでなければ入力された文字を代入 } } crc = crc_cal(k,str); printf("crc=%X\n", crc); return 0; } 文字列を分解して・・・やるんだろうなってまではなんとなくわかるのですが、 どのようにしたらよいでしょうか。。。 ご教授よろしくお願いします。

  • ASCIIコードとVisual Basic Editorのフォームについて

    仕事上、必要な為に攻略本などを片手にVisual Basic Editorを我流でプログラミングしている全くの素人です。 現在はVisual Basic Editorにフォームを挿入しテキストボックスを作成して、テキストボックスに入力した文字をSheet上の指定のセルに表示するようなプログラミングをしています。 しかし、ローマ字入力の場合は全く問題ないのですが、かな入力の場合( )カッコなど英数キーを一度押下しなければ入力できない文字については、テキストボックスのIMEコード設定をカナ入力の6番に設定している為、入力する事ができません。 1.テンキーの"/"、"*"キーに"("、" )"を割り当ててしのいでいます。一文字入力するごとに文字コードをASC関数で調査し"/"、"*"キーに該当する場合は「"それ以前に入力していた文字"+"("」を入力するプログラムにしています。しかし、この場合マウスでカーソルをインサートさせて途中入力した場合、カッコ以外の文字が入力される為完全とは言えません。また、カッコのみを入力するように指定すると、それまでテキストボックスに入力していた文字が消去されカッコのみが入力されてしまいます。良いプログラミングがありましたら、ご教授願います。 2.上記で英数キーを押下するとIMEコードが変換されるようにするのが良い方法だと思うのですがヘルプで検索してもASCIIコードが分からないので断念しました。キャリッジリターンは「13」NumLockは「144」までは分かったのですが文字キー以外のASCIIコードが掲載されている書物や方法がありましたら教えて下さい。宜しくお願い致します。

  • 文字コードについて

    データベースの文字コードとアプリケーションの文字コードが異なる場合、書き込み(INSERT)や取り出し(SELECT)はどのような扱いになるのでしょうか? イメージ的にはデータベースがUTF-8の設定の場合に、アプリケーションがSJISを指定し読み取ったデータをINSERTする場合や、SELECTで取り出す場合に何が問題になるのかを知りたいです。 質問の意図はアプリケーションやデータベースを国際化を意識して作成したく、アプリケーションはVB.NETで、CSVのファイルをsjisを指定して読み込み、それを書き込む際にそのままInsertやSelectを指定して問題ないのか、そもそもCSVファイルにはUTF-8で書き込み、読み込みもUTF-8ですべきなのでしょうか? ちなみにUTF-8がAsciiが1バイト、日本語が3バイトで扱われ、SJISの場合は、Asciiが1バイト、日本語が2バイトで扱われることは理解しています。

  • Excel でASCII文字列を16進コードへ変換

    Excel でA1セルに、 A1セル:”1234” という半角英字の文字列が入力されています。 これをすべてASCIIコードへ変換したいのですが、 何か方法はありますでしょうか? 結果は、 A2セル:”49505152” となることを想定しています。 私なりに調べたのですが、 =CODE(MID(A1,1,1)) & CODE(MID(A1,2,1)) & CODE(MID(A1,3,1)) & CODE(MID(A1,4,1)) なら、期待した結果になっておりましたが、 文字数が多い場合にかなり不効率でした。 他の方法をご教授ください。

  • シーケンサー入力で装置でよくBCDコード1248と言いますが。

    シーケンサー入力で装置でよくBCDコード1248と言いますが。 シーケンサーやカウンターの入力でよく1248(いち に よん ぱ)と言いますが、これはBCDコードを言っていると思います。  BCDコードでは2進法の0を0000で表記する為、最大16通りの組み合わせができると考えればよいのでしょうか? また何故制御機器で入力を言う場合1248と呼ぶのでしょうか?  よろしく解説お願いします。