【发布时间】:2012-09-29 17:32:10
【问题描述】:
我已经尝试过来自维基百科的示例:http://en.wikipedia.org/wiki/Longitudinal_redundancy_check
这是 lrc (C#) 的代码:
/// <summary>
/// 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
/// </summary>
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”,我做错了什么?
谢谢。
【问题讨论】:
-
那甚至不应该编译。一个字节上的数学把它变成一个 int。
-
如果维基百科错了怎么办? C# 似乎已经更改了很多次,也更改了所使用的算法(它曾经是所有字节的简单异或,顺便说一下,它也没有给出 EC 作为答案)。
-
另外,通过将结果写入十进制,您只能使用此输入从该代码中获得 71,在这种情况下,即使您得到的是,您也永远不会看到 EC答案(你会看到 236)
-
可能值得注意的是,LRC 一词本身是模棱两可的,被不同的人用来描述两种不同的算法:en.wikipedia.org/wiki/Talk%3ALongitudinal_redundancy_check。如果您要检查损坏的字节,那么 XOR 算法是最简单的,应该可以解决问题。此外,显然 Wikipedia 的算法或预期结果都不正确。