Надоело в N-ый раз (где N>20) писать алгоритм чтения файлов формата TLE. Решил написать небольшой модуль на C++ для работы с этими файлами (возможно, выложу на гуглокоде в скором времени). Ну а в таком модуле не грех и реализовать проверку контрольных сумм.
В описании формата TLE дается такая информация о способе подсчета контрольных сумм:
(Letters, blanks, periods, plus signs = 0; minus signs = 1)
Погуглил Поискал. Нашел несколько вариаций на тему алгоритма Modulo 10. Методом проб и ошибок удалось выяснить, что в TLE файлах применяется алгоритм, изложенный ниже. Решил выложить его здесь: вдруг кому пригодится.
Итак, на входе имеется строка файла.
1. Создаем счетчик равный нулю.
2. Пробегаем каждый символ входной строки и прибавляем к счетчику следующее значение:
- Если текущий символ - это цифра, то прибавляем эту цифру.
- Если текущий символ - это минус, прибавляем единицу.
- Если текущий символ - это буква, точка, пробел или плюс, то ничего не прибавляем.
Замечу, раньше, если не ошибаюсь, до 1992 года, знак "+" интерпретировался как двойка. Однако как показывает проверка, в данных с сайта http://celestrak.com/ используется только новый вариант алгоритма, в котором "+" интерпретируется как ноль, не зависимо от даты этих данных.
Из полученного числа берется последняя цифра - это и есть контрольная сумма.
Пример. Возьмем вот этот файл. Первая строка в нем такая:
Последний символ (2) - это контрольная сумма. Нам нужно подсчитать контрольную сумму остальной строки:
#include <string> #include <cstdlib> using namespace std; int checksum(const string line) { int checksum = 0; for (size_t i = 0; i < line.length(); i++) { checksum += isdigit(line[i]) ? atoi(line.substr(i, 1).c_str()) : (line[i] == '-' ? 1 : 0); } checksum -= (checksum/10) * 10; return checksum; }
Изображение с сайта http://fotki.yandex.ru/users/var-crylov/view/467404/?page=1
- fundaev's блог
- Войдите на сайт для отправки комментариев
- 7075 просмотров
Сережа! Я не стал считать контрольную сумму. У меня нет уверенности, что если строка с ошибками, то ее контрольная сумма не совпадает с указанной. Поэтому я стал просто проверять наличие всех важных полей. Как показывет анализ TLE-файлов, проблема обычно в отсутствии некоторых из полей. Это, конечно, замедляет чтение файлов, но позволяет надежно установить проблемные строки без завершения чтения всего файла. Но в принципе надо попробовать читать и контрольную сумму.
Да нет , дело, конечно, не в контрольных суммах. Просто я решил, так сказать, воочию посмотреть на исходные данные, увидеть в чем разница в проблемных файлах. К моему удивлению, не смог отыскать в сети проги для просмотра TLEшек (т.е. просто в виде графиков безо всяких пересчетов, карт Земли и т.п.) Решил написать на скорую руку (Maple и т.п. не предлагать - мы не ищем простых путей;) ). Тут понял, что придется снова читать TLE. Дело мне это изрядно поднадоело. Да и давно была идея написать библиотеку для работы с файлами TLE. Так что решил уже это сделать. Ну а раз такое дело, не грех и с контрольными суммами разобраться.
Ну, собственно, вот https://sourceforge.net/projects/tlelib/ Пока, правда, в процессе.
Идеи, замечания, предложения приветствуются.
P.S. Ну это я так ищу, откуда растут ноги %того самого% бага. Посвященные поймут ;)