私は解決策を見つけたと思います。単純にデコード アルゴリズムを提示する代わりに、理由を示したいと思います。
リンクされた質問への回答は、それが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)
- 2 つの結果の合計 (54+31=85)
- モジュロ 10 を計算し、それを 10 から引く (5-10=5)
すべてのコードのチェック ディジットを計算したところ、一致し、コードが EAN-13 形式であることを確認しました。
仕様によると、コードの最初の 2 桁または 3 桁は国コードである可能性があるため、これらを分離しようとしました。
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が得られます。
2 つの差は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;
}