Ale*_*rez 3 c# checksum parity
我试过维基百科的例子: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;
}
Run Code Online (Sandbox Code Playgroud)
它说结果是"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;
}
Run Code Online (Sandbox Code Playgroud)
这是备用LRC(简单的xor字节)
public static byte calculateLRC(byte[] bytes)
{
byte LRC = 0;
for (int i = 0; i < bytes.Length; i++)
{
LRC ^= bytes[i];
}
return LRC;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,维基百科在代码(不编译)和预期结果中都是错误的.
猜猜这个看起来更酷;)
public static byte calculateLRC(byte[] bytes)
{
return bytes.Aggregate<byte, byte>(0, (x, y) => (byte) (x^ y));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29707 次 |
| 最近记录: |