如何计算纵向冗余校验(LRC)?

我试过维基百科的例子: http : //en.wikipedia.org/wiki/Longitudinal_redundancy_check

这是lrc(C#)的代码:

///  /// Longitudinal Redundancy Check (LRC) calculator for a byte array. /// ex) DATA (hex 6 bytes): 02 30 30 31 23 03 /// LRC (hex 1 byte ): EC ///  public static byte calculateLRC(byte[] bytes) { byte LRC = 0x00; for (int i = 0; i < bytes.Length; i++) { LRC = (LRC + bytes[i]) & 0xFF; } return ((LRC ^ 0xFF) + 1) & 0xFF; } 

它说结果是“EC”但我得到“71”,我做错了什么?

谢谢。

这是一个清理版本,它没有完成所有那些无用的操作(而不是每次丢弃高位,最后一次丢弃它们),它给出了你观察到的结果。 这是使用加法的版本,但最后有一个否定 – 也可以减去并跳过否定。 即使在溢出的情况下,这也是有效的转换。

 public static byte calculateLRC(byte[] bytes) { int LRC = 0; for (int i = 0; i < bytes.Length; i++) { LRC -= bytes[i]; } return (byte)LRC; } 

这是备用LRC(简单的xor字节)

 public static byte calculateLRC(byte[] bytes) { byte LRC = 0; for (int i = 0; i < bytes.Length; i++) { LRC ^= bytes[i]; } return LRC; } 

在这种情况下,维基百科在代码(不编译)和预期结果中都是错误的。

猜猜这个看起来更酷;)

 public static byte calculateLRC(byte[] bytes) { return bytes.Aggregate(0, (x, y) => (byte) (x^ y)); } 

如果有人想从字符串中获取LRC字符:

  public static char CalculateLRC(string toEncode) { byte[] bytes = Encoding.ASCII.GetBytes(toEncode); byte LRC = 0; for (int i = 0; i < bytes.Length; i++) { LRC ^= bytes[i]; } return Convert.ToChar(LRC); } 

更正的维基百科版本如下:

 private byte calculateLRC(byte[] b) { byte lrc = 0x00; for (int i = 0; i < b.Length; i++) { lrc = (byte)((lrc + b[i]) & 0xFF); } lrc = (byte)(((lrc ^ 0xff) + 2) & 0xFF); return lrc; } 

我意识到这个问题很古老,但我很难搞清楚如何做到这一点。 它现在正在工作,所以我想我应该粘贴代码。 在我的例子中,校验和需要作为ASCII字符串返回。

 public function getLrc($string) { $LRC = 0; // Get hex checksum. foreach (str_split($string, 1) as $char) { $LRC ^= ord($char); } $hex = dechex($LRC); // convert hex to string $str = ''; for($i=0;$i