2011-12-14 53 views
0

我們通過串行線路發送一些數據,除了crc16計算外,我幾乎可以通過bash腳本(而不是代碼)完成所有工作。如果我可以在腳本和代碼中完成所有操作,它會使配置變得更容易(特別是在現場)。從CPP到bash的CRC16算法?

我用命令沒問題,但當我們遇到棘手的事情時,我失去了所有的能力。

所以我的問題是,有人可以爲我改寫這個CRC16,但在bash內嗎?

這裏是從維基百科抓起算法,而且它是一個在我們的代碼:

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);
  • 十六進制數字支持($((0xFF))將爲255)。

沒有想到,從32(64),以16位整數轉換成純擊,但你可以使用awk做到這一點:

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

這應該是足夠的Bash重寫算法。

+0

嘿,謝謝。我知道bash有很多這些操作符,但我不確定要保持變量的大小。從來沒有想過會使用awk。 – jasonmclose 2011-12-15 14:03:17