Рассчитать CRC 8 в задаче c
У меня есть приложение, в котором мне нужно отправить пакет на внешнее устройство. Этот пакет имеет CRC перед сообщением конца. CRC должен быть разделен на CRCH и CRCL. Например: CRC = 0x5B, поэтому CRCH должен быть 0x35 (ASCII-представление 5), а CRCL должен быть 0x42 (ASCII-представление B). Я искал в интернете и нашел несколько функций на С или на другом языке для создания CRC32, но мое устройство должно использовать CRC8. Как я могу создать CRC8 в Objective-C? Можете ли вы помочь мне найти способ сделать это?
1 ответ
Удивительно, как на этот довольно простой вопрос до сих пор нет ответа.
Во-первых, вам нужно разделить проблемы в вашем вопросе. CRH и CRL - это просто шестнадцатеричное преобразование, и это легко сделать (и в интернете тоже есть много примеров). В большинстве случаев вам просто нужно сравнить полученный вами CRC с рассчитанным вами. Итак, вам просто нужно преобразовать их в одну форму. Например, преобразуйте вычисленный вами CRC в текст, используя формат sprintf и% 2X, и сравните его с полученным CRC(как текст).
Вторая часть на самом деле является CRC. Это немного сложнее. Ваши варианты следующие:
1) проще всего переименовать ваш файл.m в.mm и использовать библиотеку CRC из boost C++. Это просто заголовок, так что он никак не повлияет на остальную часть вашего кода, и вы даже можете сделать это в отдельном файле, так что у вас будет функция C, которая будет использовать boost под капотом. Возможно, вам придется найти параметры для вашего CRC. Для этого посмотрите этот превосходный ресурс http://reveng.sourceforge.net/crc-catalogue/
2) Вы можете написать свою собственную реализацию. Удивительно, но в интернете есть множество примеров конкретных алгоритмов, но они часто оптимизируются под конкретные алгоритмы и их трудно принять за другие алгоритмы.
Итак, ваша лучшая ставка, вероятно, начинается со статьи Росса Уильямса "Безболезненное руководство по алгоритмам обнаружения ошибок CRC". Он также включает в себя примеры на языке C. Хотя было бы сложно разобраться во всех технических вещах и объяснениях.
Итак, как кратчайший путь, я хотел бы предложить посмотреть на мою собственную реализацию в Java здесь. Это явно не Objective-C. Но я просмотрел его, и вы сможете просто скопировать и вставить в свой файл.m и просто скомпилировать его. Возможно корректировка нескольких типов.
Вам понадобятся общедоступные статические функции longCRCR (параметры crcParams, byte[] data) и частные статические функции длинного отражения (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 нет без знака). Но это должно работать на отлично, как есть.