3

この質問は、この質問の続編です。

したがって、この番号 5252235562500 を日付と時刻 19.11.2010 15:43 にデコードする方法はありますか? このようなペアが他にもあり、それらを比較してパターンを見つけるためのスクリプトを考えています。何を確認し、パターンを検索する方法について何かアドバイスはありますか?


編集: 現在持っている 4 つのペアを追加しました。

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

3 に答える 3

8

私は解決策を見つけたと思います。単純にデコード アルゴリズムを提示する代わりに、理由を示したいと思います。

リンクされた質問への回答は、それが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 番目の列には1555があります。それを逆に翻訳すると、5155が得られます。
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;
}
于 2010-11-29T10:07:36.513 に答える
2

外国の時刻形式をデコードしようとする場合、2 つの既知の時刻が必要です。それらの違いを取り、それが何に相当するかを確認してください-秒、ミリ秒、日、あまり多くの可能性はありません. 基本的な時間単位が得られたので、時間の 1 つを操作して、元の時間が何であるかを確認できます。

私は先週これをしなければなりませんでした。私は2つの日付を持っていました:

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

2 つの日付の差を取得する方法はたくさんあります。最も簡単なのはおそらく Excel で、日数の違いが表示されます。この場合は 1.70744213 です。2 つの表現の差は 147523 です。日数に 1 日の秒数 (24*60*60) を掛けると、結果は 147523 になり、日付は開始からの経過秒数であることがわかりました。日にち。

開始日を取得するには、日付自体から日付を減算します。繰り返しますが、これは Excel では簡単です。日付の数値を 1 日の秒数で割り、減算します。私の場合、それは 1969-12-31 19:00 になります。これは少し奇妙に思えますが、夏のタイム ゾーンは UTC から 5 時間ずれていることに気付きました。これは、時刻の値が UTC であり、1970 年 1 月 1 日からの秒数を表していることを示しています。

于 2010-11-23T23:08:30.733 に答える
1

このようなスクリプトは、あなたが考えていることを意味しません。たとえば、これを時間内に手動でブレーキをかけることができるためX、おそらく時間内にこれのプログラムを作成し25*X、このプログラムは、定義したパターンのチェックに基づいて動作します。これは、ブレーキをかけるこのタイプのアルゴリズムが何千もない場合には意味がありませんが、一部が異なります。

ペアをいくつかあげてください。

于 2010-11-23T22:44:48.593 に答える