2011-12-14 63 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