在目标c中计算CRC 8

时间:2016-05-11 07:26:08

标签: ios objective-c crc

我需要将数据包发送到外部设备的应用。该分组在结束消息之前具有CRC。 CRC必须在CRCH和CRCL中分开。 例如:CRC = 0x5B,因此CRCH应为0x35(ASCII表示为5),CRCL应为0x42(B的ASCII表示)。 我在互联网上搜索,我发现用C或其他语言创建CRC32的几个函数,但我的设备需要使用CRC8。如何在Objective-C中创建CRC8?你能帮我找到办法吗?

1 个答案:

答案 0 :(得分:0)

令人惊讶的是,这个相当简单的问题仍未得到解答。

首先,您需要将问题中的问题分开。 CRH和CRL只是十六进制转换,这很容易做到(并且在互联网上也有很多例子)。在大多数情况下,您只需要将收到的crc与您计算的crc进行比较。所以,你只需要将它们转换为相同的形式。例如。使用sprintf和%2X格式将您计算的crc转换为文本,并与您收到的CRC(作为文本)进行比较。

第二部分实际上是CRC。这有点棘手。您的选择如下:

1)最简单的方法是将.m文件重命名为.mm并使用boost C ++中的CRC库。它只是一个标题包含,所以它不会以任何方式影响你的代码的其余部分,你甚至可以在一个单独的文件中创建它,所以你将有一个C函数,它将使用boost引擎盖下。 您可能需要查找CRC的参数。为此,请参阅此优秀资源http://reveng.sourceforge.net/crc-catalogue/

2)您可以编写自己的实现。令人惊讶的是,互联网上有很多特定算法的例子,但它们经常针对特定的crc进行优化,很难用于其他算法。

所以,你最好的选择可能是开始使用" CRC错误检测算法的无痛指南"罗斯威廉姆斯的文章。它还包括C中的示例。 虽然在那里了解所有的技术内容和解释可能很复杂。

所以,就像捷径一样,我想建议在java here中查看我自己的实现。它显然不是Objective-C。但我查看了它,你应该只能复制并粘贴到你的.m文件,然后编译它。可能调整几种类型。

你需要公共静态长计算CRC(参数crcParams,byte []数据)和私有静态长反射(long in,int count)函数。而Parameters类看起来更可怕,但在你的情况下应该只是一个结构:

struct Parameters
{
    int width;   // Width of the CRC expressed in bits
    long polynomial; // Polynomial used in this CRC calculation
    bool reflectIn;   // Refin indicates whether input bytes should be reflected
    bool reflectOut;   // Refout indicates whether input bytes should be reflected
    long init; // Init is initial value for CRC calculation
    long finalXor; // Xor is a value for final xor to be applied before returning result
}

您可能还希望将类型调整为较短的无符号类型(java没有无符号)。但它应该完好无损。