Я думаю, что нашел решение.Вместо того, чтобы просто представлять алгоритм декодирования, я хотел бы показать вам обоснование.
Ответ на вопрос связанный показал, что это был штрих-код в 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;
}