2010-11-23 3 views
3

Этот вопрос является продолжением this.Как декодировать некоторое число в timeDate?

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


EDIT: Я добавил четыре пары, которые я имею в наличии.

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

дать еще несколько пар, на одную пару мы не можем сделать много, потому что один является менее – Svisstack 2010-11-23 22:37:21

+1

Вы проверили для инвариантных частей, то есть каждый штрих-код начинается с `525` и заканчивается` 500`? – Actorclavilis 2010-11-23 22:38:02

+0

убедитесь, что эти цифры хороши, потому что не вы и так сообщество могут потратить некоторое время на поисковую проблему в другом месте. – Svisstack 2010-11-23 22:39:43

ответ

8

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

Ответ на вопрос linked показал, что это был штрих-код в формате 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 = 3 1)
  • суммирования двух результатов (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 

Полученные числа не имеет никакого смысла, потому что раньше время имели большее количество:
или
, чем позже:
или

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

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-й столбец имеет и . Переведите его назад, и вы получите и .
Разность двух является 55 - 51 = 4 так же, как разность минут 43 - 39 = 4
Вычесть минут от кодовых значений:
55 - 43 = 12
51 - 39 = 12

Кажется, что 4-й столбец кодирует минуты, добавляя 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; 
} 
1

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

Дайте несколько пар, тогда я могу рассказать вам больше, одна пара должна меньше знать.

2

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

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

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.