2016-05-11 12 views
0

私は外部デバイスにパケットを送信する必要があるアプリがあります。このパケットは、終了メッセージの前にCRCを有する。 CRCはCRCHとCRCLで分離する必要があります。 例:CRC = 0x5B CRCHは0x35(ASCII表現は5)、CRCLは0x42(BのASCII表現)にする必要があります。 インターネットで検索しましたが、CRC32を作成するためにCや他の言語でいくつかの関数が見つかりましたが、私のデバイスはCRC8を使用する必要があります。 Objective-CでCRC8をどのように作成できますか?これを行う方法を見つけるのを助けることができますか?目的のCのCRC 8を計算する

答えて

0

このやや単純な質問はまだ答えられていない方法を驚かせる。

まず、問題の問題を分ける必要があります。 CRHとCRLはちょうど16進数の変換であり、これは簡単です(インターネット上でも多くの例があります)。ほとんどの場合、受け取ったcrcとあなたが計算したcrcを比較する必要があります。したがって、それらを同じ形式に変換するだけで済みます。例えば。あなたが計算したcrcをsprintfと%2X形式を使ってテキストに変換し、受け取ったCRC(テキストとして)と比較してください。

2番目の部分は実際にはCRCです。

1)最も簡単なのは、.mファイルの名前を.mmに変更し、boost C++のCRCライブラリを使用することです。これはちょっと難しいです。それは単なるヘッダーのインクルードなので、コードの残りの部分には何の影響も及ぼさず、別のファイルで作成することもできます。そのため、C関数を使用してボットの下でブーストを使用します。 しかし、あなたのCRCのためのパラメータを見つける必要があるかもしれません。そのために、この優れたリソースを参照してください。http://reveng.sourceforge.net/crc-catalogue/

2)独自の実装を書くことができます。意外にも、インターネットには特定のアルゴリズムの例がたくさんありますが、特定のcrcに最適化されており、他のアルゴリズムに採用することは困難です。

したがって、おそらく最善の策は、Ross Williamsの「CRCエラー検出アルゴリズムへの辛いガイド」から始まるでしょう。それはまたCの例を含んでいます。 そこにすべての技術的なものおよび説明のまわりであなたの頭を得ることは複雑になるかもしれません。

私は自分の実装をJavaで見てみたいと思っています。here。明らかにObjective-Cではありません。しかし、私はそれを見て、あなたは単にあなたの.mファイルにコピー&ペーストしてコンパイルすることができるはずです。おそらくいくつかのタイプを調整します。

パブリックstatic long calculateCRC(パラメータcrcParams、byte [] data)関数とプライベートstatic long(long、int count)関数が必要です。そして恐ろしい見えますが、ちょうどあなたのケースでは、構造体になるべきパラメータクラス:

struct Parameters 
{ 
    int width; // Width of the CRC expressed in bits 
    long polynomial; // Polynomial used in this CRC calculation 
    bool reflectIn; // Refin indicates whether input bytes should be reflected 
    bool reflectOut; // Refout indicates whether input bytes should be reflected 
    long init; // Init is initial value for CRC calculation 
    long finalXor; // Xor is a value for final xor to be applied before returning result 
} 

あなたはまた、短い符号なしのタイプ(javaは何の符号なしを持っていない)にあっ種類を調整したい場合があります。しかしそれは完全にうまくいくはずです。