[解決済み] C言語でcrc8を計算するには?
2022-03-08 03:11:29
質問
C言語でのcrc8実装を複数見てきましたが、多項式(x8,x5,x4,1)の実装が分かりません。
0x31
と初期化
0xFF
.
また、反射入力=False、反射出力=False、最終的なXOR=。
0x00
.
いくつか試してみたところ、以下のようなことが予想されます。
CRC(0x00)=0xAC
と
CRC(0xBEEF)=0x92
.
似たような実装を見たことがありますが、実際にうまくいったものはありませんでした。私はここで正確な機能を見ました http://www.sunshine2k.de/coding/javascript/crc/crc_js.html 初期化、入力の反映、出力の反映、そして最終的なXORを与えることができるところ。しかし、誰かが私にCでの実装を指摘することができます。私は最初に我々は0xFFとしてcrcを与える必要があることを理解しているが、何も私のためにこれまでうまくいきませんでした。
試したサンプルコードを添付します。
#include <stdio.h>
#include <stdint.h>
uint8_t crc8(uint16_t input);
int main()
{
uint8_t temp1;
uint16_t temp2 = 0xBEEF;
printf("CRC input is 0x%X\n", temp2);
temp1 = crc8(temp2);
printf("CRC output is 0x%X\n", temp1);
return 0;
}
uint8_t crc8(uint16_t input)
{
uint8_t crc[8] = { };
uint8_t i;
uint8_t inv;
uint8_t output = 0;
for(i = 0; i < 16; i++)
{
inv = ((((input >> i) & 1) ^ crc[7]) & 1);
crc[7] = (crc[6] & 1);
crc[6] = (crc[5] & 1);
crc[5] = (crc[4] ^ inv & 1);
crc[4] = (crc[3] ^ inv & 1);
crc[3] = (crc[2] & 1);
crc[2] = (crc[1] & 1);
crc[1] = (crc[0] & 1);
crc[0] = (inv & 1);
}
for(i = 0; i < 8; i++){
output |= ((crc[i] << i) & (1 << i));
}
return output;
}
私が見ているのは
CRC input is 0xBEEF
CRC output is 0x2 //instead of 0x92
解決方法は?
PCやその他のリトルエンディアンプロセッサで動作していると仮定すると、temp2はメモリ上に{0xEF, 0xBE}として格納されています。最適化されていないサンプルコード(テーブルを使用していない)。より高速にするには、jを使った内部ループを256バイトのテーブル検索に置き換えることができます: crc = table[crc ^ data[i]]。
#include <stdio.h>
typedef unsigned char uint8_t;
uint8_t gencrc(uint8_t *data, size_t len)
{
uint8_t crc = 0xff;
size_t i, j;
for (i = 0; i < len; i++) {
crc ^= data[i];
for (j = 0; j < 8; j++) {
if ((crc & 0x80) != 0)
crc = (uint8_t)((crc << 1) ^ 0x31);
else
crc <<= 1;
}
}
return crc;
}
int main()
{
uint8_t data[8] = {0xBE,0xEF,0,0,0,0,0,0};
uint8_t crc;
crc = gencrc(data, 2); /* returns 0x92 */
printf("%1x\n", crc);
crc = gencrc(data+2, 1); /* returns 0xac */
printf("%1x\n", crc);
return 0;
}
関連
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み] テスト
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない