Как декодировать некоторое число в timeDate? - PullRequest
3 голосов
/ 24 ноября 2010

Этот вопрос является продолжением этого одного.

Так есть идеи, как расшифровать этот номер 5252235562500 в дату и время 19.11.2010 15:43? У меня больше таких пар, и я думаю о каком-то сценарии для сравнения их, чтобы найти образец. Любой совет, что проверить и как искать шаблоны?


РЕДАКТИРОВАТЬ: я добавил четыре пары, которые у меня есть в настоящее время.

  • 11.11.2010 16:23> 5252425372575
  • 16.11.2010 15:30> 5252922462564
  • 19.11.2010 15:39> 5252231562511
  • 19.11.2010 15:43> 5252235562500

Ответы [ 3 ]

8 голосов
/ 29 ноября 2010

Я думаю, что нашел решение.Вместо того, чтобы просто представлять алгоритм декодирования, я хотел бы показать вам обоснование.

Ответ на вопрос связанный показал, что это был штрих-код в EAN-13 формат.

Это означает, что коды имеют 12 цифр и 1 контрольную цифру:

11.11.2010 16:23 > 525242537257 5
16.11.2010 15:30 > 525292246256 4
19.11.2010 15:39 > 525223156251 1
19.11.2010 15:43 > 525223556250 0

Контрольная цифра может быть вычислена путем

  • сложения значений цифр вчетные позиции: 2, 4, 6 ... (2 + 2 + 2 + 3 + 2 + 7 = 18)
  • , умножая этот результат на 3 (18 * 3 = 54)
  • сложение значений цифр в нечетных позициях: 1, 3, 5 ... (5 + 5 + 4 + 5 + 7 + 5 = 31)
  • суммирование двух результатов (54 + 31 = 85)
  • вычисление по модулю 10 и вычитание его из 10 (5-10 = 5)

Я вычислил контрольную цифру для каждого кода, она совпала и подтвердилакоды были в формате EAN-13.

В соответствии со спецификацией, первые две или три цифры кода могут быть кодами стран, поэтому я попытался разделить их:

11.11.2010 16:23 > 52 5242537257 5 | 525 242537257 5
16.11.2010 15:30 > 52 5292246256 4 | 525 292246256 4
19.11.2010 15:39 > 52 5223156251 1 | 525 223156251 1
19.11.2010 15:43 > 52 5223556250 0 | 525 223556250 0

результирующие числа не имели никакого смысла, потому что более раннее время имело большее число:
5292246256 или 292246256
, чем более позднее время:
5223156251 или 223156251

На данный момент я подозревал, что время не было сохранено в двоичном формате.Я реорганизовал цифры и попытался найти повторяющиеся паттерны.
Я закончил с этим макетом:

11.11.2010 16:23 > 52 52 42 53 72 57 5
16.11.2010 15:30 > 52 52 92 24 62 56 4
19.11.2010 15:39 > 52 52 23 15 62 51 1
19.11.2010 15:43 > 52 52 23 55 62 50 0

Здесь все стало интересно ...

Посмотрите на3-й и 4-й ряд, они одинаковы, за исключением 4-го и 6-го столбцов.
4-й столбец имеет 15 и 55 .Переведите его в обратном направлении, и вы получите 51 и 55 .
Разница между ними составляет 55 - 51 = 4 точно так же, как разница минут 43 - 39 = 4
Вычтите минуты из кодовых значений:
55 - 43 = 12
51 - 39 = 12

Кажется, четвертый столбец кодирует минуты, добавляя 12 и сохраняя цифры в обратном направлении.

Теперь попробуйте применить это к 5-му столбцу:

11.11.2010 16:23 > 72 > 27
16.11.2010 15:30 > 62 > 26
19.11.2010 15:39 > 62 > 26
19.11.2010 15:43 > 62 > 26

26 - 15 = 11 и 27 - 16 = 11 , поэтомуразница для 5-го столбца равна 11.

С этого момента все просто, различия для столбцов составляют 15, 14, 13, 12 и 11.
Несколько быстрых вычислений, и вы получите схему кодирования:

Digits Meaning Diff.
 2-1    year    15
 4-3    month   14
 6-5    day     13
 8-7    minute  12
10-9    hour    11

Вот простой фрагмент кода для декодирования:

union TimeFormat
{
    unsigned short codearray[5];
    struct
    {
        unsigned short year;
        unsigned short month;
        unsigned short day;
        unsigned short minute;
        unsigned short hour;
    };
};

void DecodeBarcode(char *code, TimeFormat *time)
{
    char buf[3]; // for atoi()
    buf[2] = 0;  // of course it has to be null-terminated

    for (int i = 0, diff = 15; i < 5; ++i, --diff)
    {
        buf[0] = code[i * 2 + 1];
        buf[1] = code[i * 2];
        time->codearray[i] = atoi(buf) - diff;
    }
    time->year += 2000;
}
2 голосов
/ 24 ноября 2010

Когда вы пытаетесь декодировать иностранный формат времени, вам нужно два известных времени. Возьмите разницу между ними и посмотрите, к чему это приводит - секунды, миллисекунды, дни, возможностей не так уж много. Теперь, когда у вас есть базовая единица времени, вы можете работать с одним из времен и посмотреть, что такое время начала.

Мне просто нужно было сделать это на прошлой неделе. У меня было два свидания:

2009-07-15 15:29:12  1247689752
2009-07-17 08:27:55  1247837275

Есть много способов получить разницу между двумя датами. Самым простым является, вероятно, Excel, который будет отображать разницу в днях; в этом случае 1.70744213. Разница между этими двумя представлениями составляет 147523. Умножение количества дней на количество секунд в дне (24 * 60 * 60) также привело к 147523, поэтому теперь я знаю, что дата - это количество секунд, прошедших с некоторого начального значения. дата.

Чтобы получить дату начала, я вычитаю дату из себя. Опять же, это тривиально в Excel: разделите число даты на количество секунд в дне, а затем вычтите. В моем случае это 1969-12-31 19:00. Это кажется немного странным, но я понимаю, что мой часовой пояс на 5 часов от UTC летом. Это говорит мне, что значение времени указано в UTC и представляет количество секунд с 1970-01-01.

1 голос
/ 24 ноября 2010

Сценарий, подобный тому, что вы думаете, не имеет никакого смысла, потому что вы можете вручную, например, затормозить это во времени X, тогда, вероятно, вы напишите программу для этого вовремя 25*X, и эта программа будет работатьоснованный на проверке шаблонов того, что вы определяете, тогда это не имеет смысла, когда у вас нет тысяч алгоритмов, которые можно тормозить этим типом, но они различаются в какой-то небольшой части.одна пара - меньше знать.

...