iOS:CRC в объекте c

я новичок в iOS, мне нужно создать пакет данных, используя алгоритм CRC для следующих команд

 int comm[6];
 comm[0]=0x01;
 comm[1]=6;
 comm[2]=0x70;
 comm[3]=0x00;
 comm[4]=0xFFFF;
 comm[5]=0xFFFF;

у меня был java-код, который, как и в Android, развивается

         byte[] getCRC(byte[] bytes)
         {
            byte[] result = new byte[2];
            try
            {
                        short crc = (short) 0xFFFF;
                        for (int j = 0; j < bytes.length; j++)
                        {
                               byte c = bytes[j];
                                for (int i = 7; i >= 0; i--)
                                 {
                                    boolean c15 = ((crc >> 15 & 1) == 1)
                                    boolean bit = ((c >> (7 - i) & 1) == 1);
                                    crc <<= 1;
                                    if (c15 ^ bit)
                                    {
                                 crc ^=  0x1021; // 0001 0000 0010 0001 (0, 5, 12)

       }
                                            }
                            }
                            int crc2 = crc - 0xffff0000;
                            result[0] = (byte) (crc2 % 256);
                            result[1] = (byte) (crc2 / 256);


            return result;
            }
            catch(Exception ex)
            {
                            result = null;
                            return result;
            }

         }

Входные данные для метода getCRC(): пакет данных, для которого должен быть рассчитан CRC.

Вывод метода getCRC(): CRC для пакета.

То же самое мне нужно сделать в obj c, пожалуйста, помогите, если есть какой-либо пример кода.


person iosdeveloper    schedule 11.12.2014    source источник


Ответы (1)


Objective-C также включает C, поэтому содержимое вашего метода будет выглядеть почти так же, как в Java. Все, что нужно, это передать ваши данные в метод и из него, в этом примере с использованием NSData:

- (NSData *)bytesCRCResult:(NSData *)dataBytes
{
    unsigned char *result = (unsigned char *)malloc(2);
    unsigned char *bytes = (unsigned char *)[dataBytes bytes]; // returns readonly pointer to the byte stream

    uint16_t crc = (short) 0xFFFF;
    for (int j = 0; j < dataBytes.length; j++)
    {
        unsigned char c = bytes[j];
        for (int i = 7; i >= 0; i--)
        {
            bool c15 = ((crc >> 15 & 1) == 1);
            bool bit = ((c >> (7 - i) & 1) == 1);
            crc <<= 1;
            if (c15 ^ bit)
            {
                crc ^=  0x1021; // 0001 0000 0010 0001 (0, 5, 12)
            }
        }
    }

    uint16_t crc2 = crc - 0xffff0000;
    result[0] = (unsigned char) (crc2 % 256);
    result[1] = (unsigned char) (crc2 / 256);

    NSData *resultsToData = [NSData dataWithBytes:result length:2];
    free(result);
    return resultsToData;  
}

NSData может быть прочитан как необработанные байты с помощью вызова метода [NSData bytes] и имеет ряд полезных свойств и методов.

Для логического значения у вас есть несколько вариантов:

  • "bool", по-видимому, является стандартным типом ISO C/C++.
  • "Boolean" определяется как "typedef unsigned char"
  • "boolean_t" определяется как "typedef unsigned int" или "typedef int", по-видимому, в зависимости от 64-битной компиляции
  • "BOOL", логическое значение Objective-C, которое определяется как "typedef signed char", согласно http://nshipster.com/bool/ и поэтому может вести себя не так, как ожидалось.

«uint8_t» можно заменить на «unsigned char», для ясности.

Обратите внимание: приведенный выше код компилируется без предупреждений или жалоб, но не тестировался с реальными данными.

person Ri_    schedule 04.05.2015