首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISO/IEC 14443a CRC计算

ISO/IEC 14443a CRC计算
EN

Stack Overflow用户
提问于 2016-11-29 15:13:01
回答 2查看 7.5K关注 0票数 2

大家好,我正在完成我的NFC项目固件的最后一部分。我试图与一个AD-740 NFC标签通信,该标签使用NXP的MF0ULx1 MIFARE超光速EV1 -非接触式票证IC。我使用的NFC阅读器是NXP的CLRC663。我用PSOC5LP设备控制NFC读取器。

现在你已经有了所有的背景资料,我现在要问我的问题。

对于这个特定的NXP读取方法,我需要将我的Cmd和Addr编码成长度为2字节的CRC。我可以链接到的数据表引用了ISO/IEC 14443。通过谷歌搜索,我可以看到维基百科的页面,其中显示了PDF的四个部分。我假设我需要第4部分传输协议部分。唯一的问题是这个PDF被一个付费墙阻塞了。这是故意的吗?

在网上搜索我已经找到了一些代码例子,可能会阻止我购买170美元的PDF只是为了看看一个多项式.

代码示例1-我可以在注释中发布源链接。没有代表在主岗位上做这件事。

代码语言:javascript
复制
    // Calculate an ISO 14443a CRC. Code translated from the code in
    // iso14443a_crc().
    func ISO14443aCRC(data []byte) [2]byte {
        crc := uint32(0x6363)
        for _, bt := range data 
        {
            bt ^= uint8(crc & 0xff)
            bt ^= bt << 4
            bt32 := uint32(bt)
            crc = (crc >> 8) ^ (bt32 << 8) ^ (bt32 << 3) ^ (bt32 >> 4)
         }

       return [2]byte{byte(crc & 0xff), byte((crc >> 8) & 0xff)}
    }

代码示例2-我可以在注释中发布源链接。没有代表在主岗位上做这件事。

代码语言:javascript
复制
    void iso14443a_crc(byte_t* pbtData, size_t szLen, byte_t* pbtCrc)
    {
      byte_t bt;
      uint32_t wCrc = 0x6363;

      do {
        bt = *pbtData++;
        bt = (bt^(byte_t)(wCrc & 0x00FF));
        bt = (bt^(bt<<4));
        wCrc = (wCrc >> 8)^((uint32_t)bt << 8)^((uint32_t)bt<<3)^((uint32_t)bt>>4);
      } while (--szLen);

      *pbtCrc++ = (byte_t) (wCrc & 0xFF);
      *pbtCrc = (byte_t) ((wCrc >> 8) & 0xFF);
    }

,现在我的最后一个问题,,还有所有这些信息.是否可以安全地假定:

CRC多项式为: 0x6363

种子值为: 0x00FF

可视化表示可以看到这里

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-29 15:27:34

ISO14443A多项式为0x8408,初值为0x6363。

票数 4
EN

Stack Overflow用户

发布于 2018-02-09 12:11:08

在计算ISO/IEC 14443的CRC_A时,我发现了一些有用的资源:

对于后代,以下是libnfc的iso14443a_crc实现

代码语言:javascript
复制
void
iso14443a_crc(uint8_t *pbtData, size_t szLen, uint8_t *pbtCrc)
{
  uint32_t wCrc = 0x6363;

  do {
    uint8_t  bt;
    bt = *pbtData++;
    bt = (bt ^ (uint8_t)(wCrc & 0x00FF));
    bt = (bt ^ (bt << 4));
    wCrc = (wCrc >> 8) ^ ((uint32_t) bt << 8) ^ ((uint32_t) bt << 3) ^ ((uint32_t) bt >> 4);
  } while (--szLen);

  *pbtCrc++ = (uint8_t)(wCrc & 0xFF);
  *pbtCrc = (uint8_t)((wCrc >> 8) & 0xFF);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40869293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档