DOBON.NET DOBON.NETプログラミング掲示板過去ログ

CRC16の計算プラグラム

環境/言語:[環境:Windows XP SP2  使用言語:C# .NET Framework1.1]
分類:[.NET]

お世話になっています。
CRC16の計算プログラムを海外から見つけ
実際動作を行なったら、日本などにある
フリーのCRC16計算ソフトと一致しません。

それでは、どうぞよろしくお願いします。

以下、ソースです。

using System;

public class Crc16
{
const ushort polynomial = 0xA001;
ushort[] table = new ushort[256];

public ushort ComputeChecksum(byte[] bytes)
{
ushort crc = 0;

for(int i = 0; i < bytes.Length; i++)
{
byte index = (byte)(crc ^ bytes[i]);
crc = (ushort)((crc >> 8) ^ table[index]);
}
return crc;
}

public byte[] ComputeChecksumBytes(byte[] bytes)
{
ushort crc = ComputeChecksum(bytes);
return new byte[] { (byte)(crc >> 8), (byte)(crc & 0x00ff) };
}

public Crc16()
{
ushort value;
ushort temp;
for(ushort i = 0; i < table.Length; i++)
{
value = 0;
temp = i;
for(byte j = 0; j < 8; j++)
{
if(((value ^ temp) & 0x0001) != 0)
{
value = (ushort)((value >> 1) ^ polynomial);
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
}
2007/05/23(Wed) 00:36:18 編集(投稿者)

プログラムのわからない"部分"の質問ではなく丸投げですか?
ヒントだけ提示しますので、ご自分の勉強/仕事はご自身でやってください。

>フリーのCRC16計算ソフトと一致しません。

プログラムごとに返ってくる結果が同じものとは限らないようですね。

CRCについては以下を参照。
http://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB
よねKEN様

解決しました。
ある部分を変えることにより正常に動作しまいした。
解決済み!
「書き込みのマナーについて」にあるように、この掲示板では自己解決された場合でもどのように解決したのかを書いていただく決まりになっています。「ある部分を変えることにより正常に動作しまいした」とありますが、どの部分をどのように変えたのかをご説明ください。ご理解のほど、よろしくお願いいたします。
2007/05/24(Thu) 12:41:05 編集(投稿者)
2007/05/24(Thu) 12:40:58 編集(投稿者)

管理人様

ご返答ありがとうございます。

マナーについては、先ほどご確認いたしました。

「無責任、自分勝手な質問はしないでください。」

という項目に当方が当てはまることに気づきました。
新規投稿を行い、ご迷惑をおかけしました。

しかし数日間、自分で調べ理解できなかった為
こちらの掲示板に書き込みをしたのにも関わらず、
「ご自分の勉強/仕事はご自身でやってください。」という
発言は、理解しがたいものがあります。

自力でやるのでしたら、こちらの掲示板に書き込みなどしません。
他人の力を借りたい為に書き込みをしたのです。
※最終的には自力でやりましたが・・・

このようなご返答がなければ、解決方法も気持ちよく
書き込めたのにも関わらず、とても不愉快な気持ちになりました。

当方も回答者も不愉快に感じると思いますので、
このスレッドの削除依頼をお願いします。

当方に関しては、マナーを理解し今後書き込みを行なう場合は
より詳細な発言を行ないたいと思います。

それでは、どうぞよろしくお願いします。
解決済み!
■No19744に返信(ウィンさんの記事)

マナーについて確認されたのであれば、以下の項目も読まれていますよね。

> 質問者は、何をどう解決したいのか、問題解決のために一体何をしたのかというこ
> とを、具体的かつ詳細に(時にはコードを添えて)記述してください。

ウィンさんの最初の投稿を見ると

> CRC16の計算プログラムを海外から見つけ
> 実際動作を行なったら、日本などにある
> フリーのCRC16計算ソフトと一致しません。

と書かれています。これについては状況説明の範囲だと思われます。
ただ、その後で

> それでは、どうぞよろしくお願いします。
>
> 以下、ソースです。

「それでは」と、唐突にお願いされても「何をお願いされたのか」わからないわけです。
なぜ一致しないのか、ソースが悪いのか、それともソフトが間違ったCRC16を出力し
ているのか、ウィンさんがどういった解決を望んでいるのか提示されていないので、
答えようにも答えられません。

その中でよねKENさんは、CRC16はプログラムごとに同じ結果になるとは限らない
という提案をしてくださっています。ウィンさんの望む答えがなんなのかわからない以
上、提示されている「ソースファイルの動作と他のソフト(比較するためには正確なソ
フトの名前も必要ですね)の結果が違う」ということに対してお答えしているわけで、
これは正しい(と言うのもどうかとは思いますが)回答です。

ウィンさん自身が「なにを望んでいるのか」を書かれていない以上、ただソースファイ
ルを提示して「おねがいします」では丸投げと見なされても仕方ないはずです。
つまり、ソースファイルを修正して、名前もわからない日本産の他のCRC16計算ソフ
トと同じ結果を出すようにしろ!と言われているのと同じなんですね。
他人の力を借りたいという気持ちはわかりますし、回答者はそういった質問者の質
問に対して(ボランティアではありますが)理解を深めていただくために懇切丁寧に
回答しているつもりです。ただ、何でもいいからすべて借りるというのは「無責任、自
分勝手な質問」には当てはまらないでしょうか。なので、よねKENさんも
> プログラムのわからない"部分"の質問ではなく丸投げですか?
> ヒントだけ提示しますので、ご自分の勉強/仕事はご自身でやってください。
と書かれているわけです。
力を貸さないとは言っていません。ただ、自分は何もしないで(自分で調べたと書か
れていますが、最初の投稿にはそういったことは書かれていませんよね)全部おま
えらやってくれ!ではダメですよ、という意味です。

ここまで解説して、それでも
> このようなご返答がなければ、解決方法も気持ちよく
> 書き込めたのにも関わらず、とても不愉快な気持ちになりました。
とお考えであれば仕方ありません。

> 当方も回答者も不愉快に感じると思いますので、
> このスレッドの削除依頼をお願いします。

削除するか否かは管理人さんの判断によるとは思いますが、過去の様々な質問も(解
決しているかどうかに関わらず)とても大事な資料として、他の方々の参考になるは
ずです。そのために「どのように解決したのかを書いていただく決まりになっていま
す」という決まりがあるわけです。
ウィンさんも回答者も不愉快に感じるからと言ってスレッドを削除してしまったら、他
に同じような疑問を持たれた方が参考にする機会を減らしてしまっていることになり
ますよね。なので、こういった不愉快なやりとりがあったという事実を含めてスレッド
はこのまま保存しておくべきであると思いますし、なおさらウィンさんには「どのように
解決したのか」を書いていただきたいと願っています。
よろしくお願いします。
解決済み!
ぽぴ王子様

ご返答ありがとうございます。

もうここでの議論はやめませんか?
既に当方では色々な意味で解決しました。

当方が自分勝手な投稿をしたことは前の返答で認めています。

> プログラムごとに返ってくる結果が同じものとは限らないようですね。

と、よねKEN様からご返答もありました。それも判っています。
既に当方もこのCRCの計算方法を色々と調べており各CRC計算プログラムにより
値が違うことも調べていました。ですので、本来であれば、
よねKEN様から指摘がある前にお伝えするべきだったことも理解しています。


それを何度も「説明不足」「丸投げ」だったから・・・と言われても
意味の無い議論になってしまいます。

当方が不愉快に感じたのは

「ご自分の勉強/仕事はご自身でやってください」

と言う発言が気になっただけです。他に言い方があるのでは?という事です。
※不愉快に感じない方もいると思いますが、感じる方もいます。

当方は、不愉快に感じ詳しい内容を記入はしませんでしたが、他に調べてくれている方が
いるかもしれないということで「解決しました」とご返答をいれただけの事です。

最後に本題に戻るのですが、CRC計算プログラムで
参考になったURLを記入します。

http://www.zorc.breitbandkatze.de/crc.html

最初に明記したプログラムを大幅に改良し、
CRC polynom、lnitial value、final XOR valueの値を
的確に変えることにより正常に動作しました。

最後に、このスレッドは不要だと思いますので
管理人様の方で削除をお願いします。

それでは、どうぞよろしくお願いします。
解決済み!
2007/05/25(Fri) 03:45:41 編集(投稿者)

スレッドの削除については、ご期待に添えません。すでに回答の付いているスレッドは削除できません。このスレッドに投稿された全ての方が削除に同意された場合は、削除を検討します。

また、この掲示板では、ルールが守られていない投稿が全て削除されるわけではありません。無条件で削除されるのは広告目的の投稿のみで、それ以外の投稿は、少なくとも今までは、削除されることはありません。ルール違反の投稿であっても、負の遺産(ちょっと大げさですが)として残すべきというのが私の考え方です。

ウィンさんは自分勝手な投稿であったとおっしゃっていますが、客観的にはその判断は難しく、これを理由としてルール違反と決めるのは困難です。(ウィンさんのはじめの投稿をルール違反とすれば、ほとんどの投稿はルール違反となってしまうかもしれません。)

さらに、CRCの計算というテーマに関しては、情報としての価値もあると思います。

以上の理由により、スレッドの削除はできませんし、すべきではないと考えます。

もし私の考えに納得ができず、どうしても削除してほしいということでしたら、お気楽掲示板のほうへご投稿ください。

#ここからは私見です。ウィンさんはよねKENさんの言葉に不愉快な思いをされたようですが、私にはよねKENさんが悪意を持ってそのようにお書きになったとは思えません。掲示板に投稿される方は、みんな完璧という訳にはいきませんので、多少は乱暴な言い方になってしまったり、誤解を与えるような言い方になってしまうことは必ずあります。このような投稿に対して、もう少し寛大に対応していただければと思います。

もしウィンさんが、どうしても相手にその人の文章で自分が不愉快な思いをしたことを伝えたかったのであれば、ウィンさん自身がおっしゃっているように、「他に言い方」があったのではないでしょうか?それがおできにならなかったということは、ウィンさん自身、人が不愉快に感じない書き方の難しさを分かっていらっしゃるからではないでしょうか?(もし、ご自分では、人が不愉快に感じない文章がかけているとお思いでしたら、話は別ですが。)もしそれが分かっているのであれば、他人に対しても寛大になっていただけないでしょうか?
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板