Битовые операции с радиоэфиром
- Войдите на сайт для отправки комментариев
Здравствуйте,
Подскажите, пожалуйста, как правильнее сделать то, что я хочу?
У меня есть входящий поток нулей и единиц (это выход из компаратора) и представляет собой оцифрованный радиосигнал.
Этот входящий поток нулей и единиц я расцениваю как биты и мне нужно его проверить на целостность (CRC). Длина входящего сообщения известна заранее и составляет, допустим, N бит.
CRC основана на битовой операции XOR.
И вот вопрос: в каком виде мне лучше оформлять входящий поток нулей и единиц, чтобы проще его было отXORить: unsigned char, byte, String, int?
В зависимости от типа исходных данных приходится постоянно их конвертировать через strtoul(), atoi(), но я уверен, что это неэффективно.
Как я изначально хотел сделать:
byte GENERATOR = "110"; // Генератор для CRC void setup(){ // Входящее сообщение byte message[] = "01001"; // Входящий поток нулей и единиц // Сколько символов содержится в этом массиве int message_length = sizeof(message) - 1; // -1 завершающий символ // Сколько символов содержится в полиноме int gen_length = sizeof(GENERATOR) - 1; // -1 завершающий символ // Проверка целостности входящего сообщения for (byte x = 0; x < message_length; x++){ if (String(message[x]) == "1"){ for (byte j = 0; j < gen_length; j++){ // XOR // И вот здесь начинаются ошибки типов данных message[x + j] = message[x + j] ^ GENERATOR[j]; } } } // Вывожу результат Serial.print(F("Result: ")); for (byte x = 0; x < message_length; x++){ Serial.print(message[x]); } } void loop(){}
Для упрощения я пропустил ряд действий (дописать необходимое количество нулей к исходному сообщению, количество которых на 1 меньше длины содержимого GENERATOR, проверить значение остатка после XOR).
Это одно и тоже. Мне кажется именно это и есть лучшее решение для Вас.
Не сходите с ума
Можно. В каких-то случаях удобнее, чем byte. Выбор зависит от других обстоятельств, о которых мне неизвестно. Из того, что Вы написали, я бы остановился на byte.
Евгений, спасибо за поддержку.
Я понял в чем была моя изначальная ошибка и почему мне приходилось прибегать к ненужной конверсии типов данных. Я изначально неправильно сформулировал массив для хранения поступающего потока нулей и единиц.
Вместо
мне надо было просто использовать
и все. И никаких сложностей потом нет. И тип - byte, конечно же )).
Спасибо.