C# 如何计算C中的CRC_B#
如何计算ISO 14443中描述的C#中的CRC#U B编码? 以下是一些背景信息: CRC_B编码 本附录用于解释目的,并指出了将使用的位模式 存在于物理层。它用于检查ISO/IEC标准 14443-3 CRC_B编码的B型实现。参考ISO/IEC 3309和CCITT X.25 2.2.7和V.42 8.1.1.6.1了解更多详细信息。初始值='FFFF'C# 如何计算C中的CRC_B#,c#,crc,iso,C#,Crc,Iso,如何计算ISO 14443中描述的C#中的CRC#U B编码? 以下是一些背景信息: CRC_B编码 本附录用于解释目的,并指出了将使用的位模式 存在于物理层。它用于检查ISO/IEC标准 14443-3 CRC_B编码的B型实现。参考ISO/IEC 3309和CCITT X.25 2.2.7和V.42 8.1.1.6.1了解更多详细信息。初始值='FFFF' 示例1:对于0x00 0x00 0x00,应以0xCC 0xC6的CRC_B结束 示例2:对于0x0F 0xAA 0xFF,应以0xF
- 示例1:对于0x00 0x00 0x00,应以0xCC 0xC6的CRC_B结束
- 示例2:对于0x0F 0xAA 0xFF,应以0xFC 0xD1的CRC_B结束
我尝试了一些随机的CRC16库,但它们没有给我相同的结果。我在中也没有从在线检查中得到相同的结果。我在中从C代码中反转了这一点,因此它并不漂亮,但可以满足您的需要:
public class CrcB
{
const ushort __crcBDefault = 0xffff;
private static ushort UpdateCrc(byte b, ushort crc)
{
unchecked
{
byte ch = (byte)(b^(byte)(crc & 0x00ff));
ch = (byte)(ch ^ (ch << 4));
return (ushort)((crc >> 8)^(ch << 8)^(ch << 3)^(ch >> 4));
}
}
public static ushort ComputeCrc(byte[] bytes)
{
var res = __crcBDefault;
foreach (var b in bytes)
res = UpdateCrc(b, res);
return (ushort)~res;
}
}
当我尝试运行此测试时,出现以下异常:System.OverflowException:算术运算导致溢出。它指向第行:ch=(字节)(ch^(ch)创建异常时您使用的字节值是什么?我尝试了大量的变体,但无法获得溢出。可能是溢出是必要的,我对C编译器不够熟悉,不知道这是否是默认值。我修改了代码以反映这一点。就是这样。我必须取消选中从项目属性中选择“检查算术溢出/下溢”选项,使其与SharpDevelop IDE一起工作。
public static void Main(string[] args)
{
// test case 1 0xFC, 0xD1
var bytes = new byte[] { 0x0F, 0xAA, 0xFF };
var crc = CrcB.ComputeCrc(bytes);
var cbytes = BitConverter.GetBytes(crc);
Console.WriteLine("First (0xFC): {0:X}\tSecond (0xD1): {1:X}", cbytes[0], cbytes[1]);
// test case 2 0xCC, 0xC6
bytes = new byte[] { 0x00, 0x00, 0x00 };
crc = CrcB.ComputeCrc(bytes);
cbytes = BitConverter.GetBytes(crc);
Console.WriteLine("First (0xCC): {0:X}\tSecond (0xC6): {1:X}", cbytes[0], cbytes[1]);
Console.ReadLine();
}