こんにちは、ソフトウェア インターフェイスを書きたいデバイスの CRC を計算しようとしています。簡単にするために、X をデバイス、Y をハードウェア コントローラーとします。私は正しい方向へのナッジを探しています。いくつかの点で少し混乱しているだけで、正しい軌道に乗っていると確信しています。
デバイスがアイドル状態のとき、次のデータ文字列を 2 秒ごとに送信します。これは、16 進数でカウントアップしているように見えます: 間の 2 バイト| |
は、私が想定する CRC です。(XX) は可変バイトです。
X: 96 10 01 E1 (E4) 01 FF 10 17 | F7 EC | 10 06 E1 96 FE X: 96 10 01 E1 (E6) 01 FF 10 17 | 7F FA | 10 06 E1 96 FE X: 96 10 01 E1 (E8) 01 FF 10 17 | C7 9B | 10 06 E1 96 FE X: 96 10 01 E1 (EA) 01 FF 10 17 | 4F 8D | FE 10 06 E1 96 FE X: 96 10 01 E1 (EC) 01 FF 10 17 | D7 B6 | FE 10 06 E1 96 FE X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE
reveng
withreveng -w 16 -s
と上記のデータセットを使用すると、次のようになります。
width=16 poly=0x1021 init=0x1e69 refin=true refout=true xorout=0x0000 check=0x3da6 name=(なし)
コントローラーから a コマンドをインターセプトすると、次のようになります。
X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE -- コマンドの前の最後の行 Y: E1 10 01 96 (22) 05 01 C0 A8 35 00 10 17 |0B B8| FE 10 06 96 E1 FE
(22) は修飾子|0B B8|
で、CRC です。22 は E4 からどのように派生したのですか? それは別のCRCですか?
同じコマンドを数回送信したところ、次のものが傍受されました。
Y: E1100196220501C0A8350010170BB8FE100696E1FE Y: E11001962A0501C0A835001017C1C7FE100696E1FE Y: E11001962E0501C0909400101753C8FE100696E1FE Y: E1100196300501809094001017C3EEFE100696E1FE Y: E1100196360501C090940010170D48FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE Y: E11001962A0501C09094001017B6F7FE100696E1FE
reveng
withreveng -w 16 -s
と上記のデータセットを使用すると、次のようになります。
width=16 poly=0x1021 init=0xd313 refin=true refout=true xorout=0x0000 check=0x295f name=(なし)
多項式は同じですが、初期化とチェックは異なります。長い投稿で申し訳ありませんが、私の質問の要約は次のとおりです。
1) たとえば、デバイスが同じ多項式を使用するが、異なる初期化とコントローラーへのチェックを使用するのは一般的ですか?
2) デバイスからの文字列をカウントする定数は、チェックサムの計算に使用される変数バイトをオフセットするために使用されますか? もしそうなら、このメカニズムは何と呼ばれ、カウントとバイトの関係を導き出すためにどのような方法を使用できますか?
3) 私は正しい道を進んでいますか、それとも途中で道に迷いましたか?
これを読んでくれてありがとう、そして正しい方向へのキックを本当に感謝します.