在 objective c 中计算 CRC 8
Calculate CRC 8 in objective c
我有一个应用程序,我需要在其中向外部设备发送数据包。此数据包在结束消息之前有一个 CRC。 CRC 必须在 CRCH 和 CRCL 中分开。
例如:CRC = 0x5B 所以 CRCH 应该是 0x35(5 的 ASCII 表示),CRCL 应该是 0x42(B 的 ASCII 表示)。
我在互联网上搜索并发现了几个 C 或其他语言的函数来创建 CRC32,但我的设备需要使用 CRC8。如何在 Objective-C 中创建 CRC8?你能帮我想办法吗?
令人惊讶的是,这个相当简单的问题仍然没有答案。
首先,您需要将问题中的问题分开。 CRH 和 CRL 只是十六进制转换,这很容易做到(互联网上也有很多例子)。在大多数情况下,您只需要将收到的 crc 与您计算的进行比较。所以,你只需要将它们转换成相同的形式。例如。使用 sprintf 和 %2X 格式将您计算的 crc 转换为文本,并与您收到的 CRC 进行比较(作为文本)。
第二部分实际上是CRC。这个有点trickier.Your选项如下:
1) 最简单的方法是将 .m 文件重命名为 .mm 并使用来自 boost C++ 的 CRC 库。它只是一个 header 包含,因此它不会以任何方式影响您的代码的其余部分,您甚至可以将它放在一个单独的文件中,因此您将拥有一个 C 函数,该函数将在后台使用 boost。
不过,您可能需要为您的 CRC 查找参数。为此,请参阅此优秀资源 http://reveng.sourceforge.net/crc-catalogue/
2) 您可以编写自己的实现。令人惊讶的是,互联网上有大量针对特定算法的示例,但它们通常针对特定的 crc 进行了优化,并且很难被其他算法采用。
因此,您最好的选择可能是从 Ross Williams 的 "A Painless Guide to CRC Error Detection Algorithms" 文章开始。它还包括 C 中的示例。
尽管要理解其中的所有技术内容和解释可能很复杂。
因此,作为捷径,我想建议查看 java here 中我自己的实现。显然不是Objective-C。但我仔细查看了它,你应该能够复制并粘贴到你的 .m 文件并编译它。可能调整了几个类型。
你需要 public static long calculateCRC(Parameters crcParams, byte[] data) 和 private static long reflect(long in, int count) 函数。参数 class 看起来更可怕,但在您的情况下应该只是一个结构:
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 没有无符号)。但它应该可以正常工作。
我有一个应用程序,我需要在其中向外部设备发送数据包。此数据包在结束消息之前有一个 CRC。 CRC 必须在 CRCH 和 CRCL 中分开。 例如:CRC = 0x5B 所以 CRCH 应该是 0x35(5 的 ASCII 表示),CRCL 应该是 0x42(B 的 ASCII 表示)。 我在互联网上搜索并发现了几个 C 或其他语言的函数来创建 CRC32,但我的设备需要使用 CRC8。如何在 Objective-C 中创建 CRC8?你能帮我想办法吗?
令人惊讶的是,这个相当简单的问题仍然没有答案。
首先,您需要将问题中的问题分开。 CRH 和 CRL 只是十六进制转换,这很容易做到(互联网上也有很多例子)。在大多数情况下,您只需要将收到的 crc 与您计算的进行比较。所以,你只需要将它们转换成相同的形式。例如。使用 sprintf 和 %2X 格式将您计算的 crc 转换为文本,并与您收到的 CRC 进行比较(作为文本)。
第二部分实际上是CRC。这个有点trickier.Your选项如下:
1) 最简单的方法是将 .m 文件重命名为 .mm 并使用来自 boost C++ 的 CRC 库。它只是一个 header 包含,因此它不会以任何方式影响您的代码的其余部分,您甚至可以将它放在一个单独的文件中,因此您将拥有一个 C 函数,该函数将在后台使用 boost。 不过,您可能需要为您的 CRC 查找参数。为此,请参阅此优秀资源 http://reveng.sourceforge.net/crc-catalogue/
2) 您可以编写自己的实现。令人惊讶的是,互联网上有大量针对特定算法的示例,但它们通常针对特定的 crc 进行了优化,并且很难被其他算法采用。
因此,您最好的选择可能是从 Ross Williams 的 "A Painless Guide to CRC Error Detection Algorithms" 文章开始。它还包括 C 中的示例。 尽管要理解其中的所有技术内容和解释可能很复杂。
因此,作为捷径,我想建议查看 java here 中我自己的实现。显然不是Objective-C。但我仔细查看了它,你应该能够复制并粘贴到你的 .m 文件并编译它。可能调整了几个类型。
你需要 public static long calculateCRC(Parameters crcParams, byte[] data) 和 private static long reflect(long in, int count) 函数。参数 class 看起来更可怕,但在您的情况下应该只是一个结构:
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 没有无符号)。但它应该可以正常工作。