2016-05-11 11 views
0

Ich habe eine App, in der ich ein Paket an ein externes Gerät senden muss. Dieses Paket hat vor der Endnachricht einen CRC. Der CRC muss in CRCH und CRCL getrennt sein. Zum Beispiel: CRC = 0x5B also CRCH sollte 0x35 (ASCII-Darstellung von 5) und CRCL sollte 0x42 (ASCII-Darstellung von B) sein. Ich suchte im Internet und ich fand mehrere Funktionen in C oder in einer anderen Sprache, um CRC32 zu erstellen, aber mein Gerät muss einen CRC8 verwenden. Wie kann ich ein CRC8 in Objective-C erstellen? Kannst du mir helfen, einen Weg zu finden, dies zu tun?Berechnen Sie CRC 8 in Ziel c

Antwort

0

Überraschend, wie diese ziemlich einfache Frage immer noch nicht beantwortet wird.

Zuerst müssen Sie Probleme in Ihrer Frage trennen. CRH und CRL sind nur Hex-Konvertierung und das ist einfach zu tun (und hat auch viele Beispiele im Internet). In den meisten Fällen müssen Sie nur crc vergleichen, die Sie erhalten haben, mit einer, die Sie berechnet haben. Also müssen Sie sie nur in die gleiche Form konvertieren. Z.B. wandle das von dir berechnete crc im Sprintf- und% 2X-Format in Text um und vergleiche es mit CRC, das du erhalten hast (als Text).

Der zweite Teil ist eigentlich CRC. Dies ist ein wenig komplizierter. Ihre Optionen lauten wie folgt:

1) Am einfachsten ist es, Ihre .m-Datei in .mm umzubenennen und die CRC-Bibliothek von Boost C++ zu verwenden. Es ist nur ein Header-Include, so dass es den Rest des Codes in keiner Weise beeinflusst und du kannst es sogar in einer separaten Datei erstellen, also hast du eine C-Funktion, die Boost unter der Haube nutzt. Sie müssen jedoch möglicherweise Parameter für Ihre CRC finden. Dafür sehen Sie diese ausgezeichnete Ressource http://reveng.sourceforge.net/crc-catalogue/

2) Sie können Ihre eigene Implementierung schreiben. Überraschenderweise gibt es viele Beispiele für bestimmte Algorithmen im Internet, aber sie sind oft für bestimmte CRC optimiert und für andere Algorithmen schwer zu übernehmen.

Also, Ihre beste Wette beginnt wahrscheinlich mit "A Schmerzfreie Anleitung zu CRC Error Detection-Algorithmen" Artikel von Ross Williams. Es enthält auch Beispiele in C. Obwohl es kompliziert sein könnte, sich um alle technischen Sachen und Erklärungen dort zu kümmern.

Also, als Abkürzung möchte ich vorschlagen, meine eigene Implementierung in Java here zu betrachten. Es ist offensichtlich nicht Objective-C. Aber ich habe es durchgesehen und Sie sollten in der Lage sein, einfach in Ihre .m-Datei zu kopieren und einzufügen und sie einfach zu kompilieren. Möglicherweise einige Arten anpassen.

Sie benötigen public static long calculateCRC (Parameter crcParams, byte [] data) und private static long reflect-Funktionen (long in, int count). Und die Parameter-Klasse, die erschreckenden aussieht, soll aber nur eine Struktur in Ihrem Fall wird:

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 
} 

Vielleicht wollen Sie auch auch Typen anpassen es zu einem kürzeren Typ ohne Vorzeichen (Java hat keine unsigned). Aber es sollte so gut funktionieren wie es ist.