当前位置: 首页 > 知识库问答 >
问题:

5位poly(0x15)的caculacing Crc

印子平
2023-03-14

我有两个CRC需要解决。多项式长度:8位,带有隐式第9位1位多项式值:0x85初始值:0x00

My first was very easy, with the following code. 

  byte generator = 0x85;
            byte crc = 0; /* start with 0 so first byte can be 'xored' in */

            foreach (byte currByte in bytes)
            {
                crc ^= currByte; /* XOR-in the next input byte */

                for (int i = 0; i < 8; i++)
                {
                    if ((crc & 0x80) != 0)
                    {
                         crc = (byte)((crc << 1) ^ generator);
                    }
                    else
                    {
                        crc <<= 1;
                    }
                }
            }

            return crc;

但对于我的生活,我不知道5位是如何工作的。当然,发电机是0x15,但这是不工作在上面。我想也许我运行循环5次而不是8次,但这也没有得到它。

0x15多项式的CRCs示例。0x80、0x00应获得0x01的5bit crc

0x00、0x20应获得0x15的5bit crc

为了更好地理解这是如何工作的。有一个2字节的内存地址,每32字节步进一次。由于5个额外的比特从未使用过,crc就在其中。

内存地址0x0020示例

000000000000100000(0x20)

下面的建议,但没有得到结果,我应该。

byte generator = 0x15;
byte crc = 0; /* start with 0 so first byte can be 'xored' in */

foreach (byte currByte in bytes)
{
    crc ^= currByte; /* XOR-in the next input byte */

    for (int i = 0; i < 8; i++)
    {
        if ((crc & 0x80) != 0)
        {
             crc = (byte)((crc << 1) ^ (generator << 3));
        }
        else
        {
            crc <<= 1;
        }
    }
}
return (byte)(crc >>= 3);

共有1个答案

阳宾实
2023-03-14

您需要if((crc&0x20)!=0),并在末尾crc&=0x1f;删除字节中向上移动的无关位。

您还需要在CRC的正确位上排他-或数据。

下面是一个C语言的例子:

#include <stddef.h>
#include <stdint.h>

uint8_t crc5(uint8_t crc, void const *mem, size_t len) {
    unsigned char const *data = mem;
    if (data == NULL)
        return 0;
    crc <<= 3;
    for (size_t i = 0; i < len; i++) {
        crc ^= data[i];
        for (unsigned k = 0; k < 8; k++) {
            crc = crc & 0x80 ? (crc << 1) ^ 0xa8 : crc << 1;
        }
    }
    crc >>= 3;
    return crc;
}

如果这个5位CRC总是在16位值的高11位上计算,那么这个示例将计算5位CRC并检查它:

#include <stdint.h>

uint16_t crc5h(uint16_t addr, int k) {
    while (k--)
        addr = addr & 0x8000 ? (addr << 1) ^ 0xa800 : addr << 1;
    return addr >> 11;
}

当使用低五位为零且k等于11的地址调用时,将返回要插入的五位CRC。与结果CRC独占的地址是要发送的地址。如果将该16位消息发送到CRC5H(),且K等于16,则所有16位都将被处理,如果接收到的消息没有错误,结果将始终为零。

 类似资料:
  • 该项目的目的是提供一个 Windows 和 Linux 下的应用程序,用来读写各种射频ID(RFID)标签,支持各种不同的RFID读取设备。

  • 该程序只是为了验证 iPhone 的应用程序开发,学习 iPhone 的开发人员不妨看看。该项目主要包含 iPhone 的一些编程概念包括: MVC patterns: this application uses the Interface Builder and an MVC approach to modeling a polygon shape. Custom UIViews and Dra

  •        定位成功后点击定位按钮,会开启持续定位功能,当位置发生改变时会定时进行位置更新并飞行到当前位置,再次点击按钮会关闭持续定位功能。若定位失败,点击时会提示“未获取到定位信息,无法开启定位服务”。        如果没有定位成功,则可按下面可能进行检查: 需要在手机设置中,位置,打开精确定位,即启动GPS。一般手机可以在顶部下拉菜单中找到GPS开关; 确保定位的时候在室外,且顶部30°角

  • 本文向大家介绍Safari 5中的HTML5地理位置,包括了Safari 5中的HTML5地理位置的使用技巧和注意事项,需要的朋友参考一下 HTML5 Geolocation API使您可以与自己喜欢的网站共享位置。JavaScript可以捕获您的经度和纬度,可以将其发送到后端Web服务器,并可以进行精美的位置感知操作,例如查找本地商家或在映射上显示您的位置。 示例 让我们看看如何获取当前位置-

  • 以下问题是在最近的一次微软采访中提出的 给定一个大小为 5 的未排序数组。需要多少个最小比较才能找到中位数?然后他把它扩展为n号。 根据我的说法,5个元素的解是6 这可以扩展到n个元素。如果不是,除了快速选择之外,我们如何在O(n)中的n个元素中找到中位数

  • 问题内容: 刚刚开始进入HTML 5并测试地理位置…到目前为止为止。不过,我遇到了一些减速带…当我尝试获取地理位置时,Chrome会自动阻止页面获取我的位置。在其他站点(例如以下站点)上不会发生这种情况: 我正在使用的脚本: 我正在从计算机上的本地目录进行测试,因此实际上并没有像“http://whatever.com/mytestpage.html”这样的“域”。这就是为什么我没有得到提示吗?如