Лаборатория космических исследований

Ульяновская секция Поволжского отделения Российской Академии Космонавтики им. К. Э. Циолковского

Ульяновский Государственный Университет
О контрольных суммах в файлах TLE

Надоело в N-ый раз (где N>20) писать алгоритм чтения файлов формата TLE. Решил написать небольшой модуль на C++ для работы с этими файлами (возможно, выложу на гуглокоде в скором времени). Ну а в таком модуле не грех и реализовать проверку контрольных сумм.

В описании формата TLE дается такая информация о способе подсчета контрольных сумм:

Цитата:
Checksum (Modulo 10)

(Letters, blanks, periods, plus signs = 0; minus signs = 1)

Погуглил Поискал. Нашел несколько вариаций на тему алгоритма Modulo 10. Методом проб и ошибок удалось выяснить, что в TLE файлах применяется алгоритм, изложенный ниже. Решил выложить его здесь: вдруг кому пригодится.

Итак, на входе имеется строка файла.

1. Создаем счетчик равный нулю.

2. Пробегаем каждый символ входной строки и прибавляем к счетчику следующее значение:

  • Если текущий символ - это цифра, то прибавляем эту цифру.
  • Если текущий символ - это минус, прибавляем единицу.
  • Если текущий символ - это буква, точка, пробел или плюс, то ничего не прибавляем.

Замечу, раньше, если не ошибаюсь, до 1992 года, знак "+" интерпретировался как двойка. Однако как показывает проверка, в данных с сайта http://celestrak.com/  используется только новый вариант алгоритма, в котором "+" интерпретируется как ноль, не зависимо от даты этих данных.

Из полученного числа берется последняя цифра - это и есть контрольная сумма.

Пример. Возьмем вот этот файл. Первая строка в нем такая:

Цитата:
1 16609U 86017A   86050.94902635 -.00007594  52524-4  00000+0 0    12

Последний символ (2) - это контрольная сумма. Нам нужно подсчитать контрольную сумму остальной строки:

Цитата:
1 16609U 86017A   86050.94902635 -.00007594  52524-4  00000+0 0    1

Заменяем пробелы, точки и алфавитные символы на 0, символы "-" - на единицу. Получаем:
Цитата:
10166090086017000086050094902635010000075940052524140000000000000001
Складываем все числа, получаем 152. Последний разряд в сумме равен 2, это и есть контрольная сумма.
 
Ниже приведен код программы на языке C++ для подсчета контрольной суммы строки данным алгоритмом.
 

 

 

 

 

#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

Сережа! Я не стал считать контрольную сумму. У меня нет уверенности, что если строка с ошибками, то ее контрольная сумма не совпадает с указанной. Поэтому я стал просто проверять наличие всех важных полей. Как показывет анализ  TLE-файлов,  проблема обычно в отсутствии некоторых из полей. Это, конечно, замедляет чтение файлов, но позволяет надежно установить проблемные строки без завершения чтения всего файла. Но в принципе надо попробовать читать и контрольную сумму. 

Да нет , дело, конечно, не в контрольных суммах.  Просто я решил, так сказать, воочию посмотреть на исходные данные, увидеть в чем разница в проблемных файлах. К моему удивлению, не смог отыскать в сети проги для просмотра TLEшек (т.е. просто в виде графиков безо всяких пересчетов, карт Земли и т.п.) Решил написать на скорую руку (Maple и т.п. не предлагать - мы не ищем простых путей;) ). Тут понял, что придется снова читать TLE. Дело мне это изрядно поднадоело. Да и давно была идея написать библиотеку для работы с файлами TLE. Так что решил уже это сделать. Ну а раз такое дело, не грех и с контрольными суммами разобраться.

Ну, собственно, вот https://sourceforge.net/projects/tlelib/ Пока, правда, в процессе.

Идеи, замечания, предложения приветствуются.

P.S. Ну это я так ищу, откуда растут ноги %того самого% бага. Посвященные поймут ;)