문제

ISO 14443에 설명 된대로 C#에서 CRC_B 인코딩을 계산하는 방법은 무엇입니까? 배경 정보는 다음과 같습니다.

이 부록을 인코딩하는 CRC_B는 설명 목적으로 제공되며 물리적 층에 존재할 비트 패턴을 나타냅니다. CRC_B 인코딩의 ISO/IEC 14443-3 유형 B 구현을 확인하기 위해 포함됩니다. 자세한 내용은 ISO/IEC 3309 및 CCITT X.25 2.25 및 V.42 8.1.1.6.1을 참조하십시오. 초기 값 = 'ffff'

  • 예 1 : 0x00 0x00 0x00의 경우 0xcc 0xc6의 CRC_B로 끝나야합니다.
  • 예 2 : 0x0f 0xaa 0xff의 경우 0xfc 0xd1의 CRC_B로 끝나야합니다.

나는 임의의 CRC16 라이브러리를 시도했지만 나에게 동일한 결과를 제공하지는 않는다. 나는 온라인 수표에서 같은 결과를 얻지 못했습니다. 여기.

도움이 되었습니까?

해결책

C 코드에서 이것을 반대로했습니다 ISO/IEC JTC1/SC17 N 3497 그래서 그것은 예쁘지는 않지만 필요한 것을합니다.

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;
    }
}

테스트로 아래 코드를 사용해보십시오.

 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();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top