将BCD编码的十六进制值转换为时间戳/数据和时间(ASN.1语法)

时间:2016-03-25 08:03:27

标签: java datetime timestamp bouncycastle

嗨我有MSC生成的十六进制时间戳字符串(是相邻基站保留移动用户位置的记录)。现在我想将十六进制字符串转换为人类可读的日期和时间。

听实际的十六进制字符串变量是Octet String数据类型(ASN.1语法)

让我举一个例子,十六进制字符串是什么样的

hexadecimal value : 1307301826042B0530

听到将BCD编码时间戳转换为低于

的十六进制值
Local time of UTC compression format
--YY    =   Year 00 to 99       BCD encoded
--MM    =   Month 01 to 12      BCD encoded
--DD    =   Day 01 to 31        BCD encoded
-- hh   =   hour 00 to 23       BCD encoded
-- mm   =   minute 00 to 59     BCD encoded
-- ss   =   second 00 to 59     BCD encoded
-- S    =   Sign 0 = “+”, “-“       ASCII encoded
-- hh   =   hour 00 to 23       BCD encoded
-- mm   =   minute 00 to 59     BCD encoded

所以波纹管表显示Octet String的时间戳

in ASN.1 syntax it look like  TimeStamp ::= OCTET STRING (SIZE(9))

Octet 1 YY
Octet 2 MM
Octet 3 DD
Octet 4 hh
Octet 5 mm
Octet 6 ss
Octet 7 S
Octet 8 hh
Octet 9 mm

因此根据上表,十六进制值可以划分为休闲

 Hex value : 1307301826042B0530

    Octet 1 YY  : 13  
    Octet 2 MM  : 07
    Octet 3 DD  : 30
    Octet 4 hh  : 18            Hear every octet is of one byte each
    Octet 5 mm  : 26
    Octet 6 ss  : 04 
    Octet 7 S  :  2B
    Octet 8 hh  : 05
    Octet 9 mm  : 30

所以要将十六进制转换为时间戳/日期和时间我做的如下

首先我将每个十六进制字节转换为BCD,BCD转换为二进制,二进制转换为十进制,然后我得到

Decimal : 685571919861616

然后我尝试转换为日期和时间

        String decimal = "685571919861616";
        Calendar c=Calendar.getInstance();
        c.setTimeInMillis(Long.parseLong(decimal));

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

        System.out.println(dateFormat.format(c.getTime()));

但输出类似于23694-11-28 09:54:21

即使我尝试将十六进制转换为十进制,然后使用java将十进制转换为日期和时间,但输出类似于8227-12-21 02:24:03

请帮助我,我想知道Bouncy castle API中是否有任何课程可以做到这一点...... ???

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在处理编码文件的解码之前,我们应该清楚地了解编码是如何完成的,之后只需几秒钟即可解决上述问题

正如我所说的Octet字符串的时间戳值看起来像这样

Hex value : 1307301826042B0530

    Octet 1 YY  : 13  
    Octet 2 MM  : 07
    Octet 3 DD  : 30
    Octet 4 hh  : 18            Hear every octet is of one byte each
    Octet 5 mm  : 26
    Octet 6 ss  : 04 
    Octet 7 S  :  2B
    Octet 8 hh  : 05
    Octet 9 mm  : 30

它清楚地表明YY = 13意味着2013年明智的MM = 07,DD = 30,hh = 18(24小时格式)......等等

经过分析后,我感到很震惊,因为它很容易,为此我已经让我头了2天,因为我没有太多关于如何编码的信息。