2011-12-14 19 views
0

私たちはシリアル回線でデータを送信していますが、crc16計算を除いて、(コードの代わりに)bashスクリプトを使ってすべてを行うことができます。もし私がスクリプトとコードの両方でそれをすべて行うことができれば、(特にフィールドの中で)heckofalotの設定が簡単になります。CPPからbashへのCRC16アルゴリズム?

私はコマンドで大丈夫ですが、トリッキーなものになるとすべての能力を失います。

私の質問は誰かが私のためにこのCRC16の書き換えを行うことができますが、bashの中でですか?ここ

はウィキペディアからつかんアルゴリズムであり、そしてそれは我々のコードの1です:

uint16_t Encoder::checksum(std::string thestring) 
{ 
    uint8_t d, e, f; 
    uint16_t c, r, crccalc; 
    c = 0xffff; 

    for (unsigned int i = 0; i < thestring.length(); i++) 
    { 
     d = thestring[i]; 
     e = c^d; 
     f = e^(e << 4); 
     r = (c >> 8)^(f << 8)^(f << 3)^(f >> 4); 
     c = r; 
    } 
    c ^= 0xffff; 
    crccalc = c; 
    return crccalc; 
} 

私は簡単にC++コードのうち、実行可能ファイルを作成し、ちょうど標準入力、それを養うが、私はそれを考えることができますこれをbashの中に持つことができるのは本当にきれいです。

私が知りませんが、私の可変サイズが正しいことを確認する方法です。どのように私は16ビット整数を取得していることを確認できますか?

助けがあれば助かります。私は少しスクリプトをオンラインで見つけましたが、私はそれを信用しませんでした。ここで答えたのは本当にクールだろうと思った。

答えて

0

バッシュを有する:

  • XOR($((5^2)) 7であろう)。
  • 左シフト($(3<<2)は12になります)。
  • 右シフト($(8>>2)は2になります)。
  • 16進数サポート($((0xFF))は255になります)。

何も純粋なバッシュで32(64)16ビット整数から変換するために、心に来ることはありませんが、あなたはawkのでそれを行うことができます。

$ echo 65536 | awk '{printf("%hu\n",$1)}' 
0 

はこれがバッシュにアルゴリズムを書き換えるために十分でなければなりません。

+0

ねえ、ありがとう。私は、bashにはこれらの演算子がたくさんあることは知っていますが、変数のサイズを維持することについてはわかりません。それのためにawkを使ったことはなかったでしょう。 – jasonmclose

+1

私は先に進んで、C++コードを使用する小さなプログラムを作成し、標準のinから文字列を読み込み、crcを与えます。その後、私はbashの部分に試行を与えます。 (bash関数の出力がC++コードと一致するかどうかに基づいて) – jasonmclose

+0

awkを使うつもりなら、gawk(通常はlinuxで手に入るもの)にはleft-右シフト、xorなど**名前付き演算子**(彼らはfuctionsのように見えます)http://www.gnu.org/s/gawk/manual/gawk.html#index-left-shift_002c-bitwise-1459を参照してください。 。ちょうどそれをすべてgawkでやってください!がんばろう。 – shellter

関連する問題