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

Convert BCD encoded hexadecimal value into timestamp / data and time ( ASN.1 syntax)

您好,我有 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

下面table显示八位字节串的时间戳

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

所以根据上面table十六进制值可以分为休闲

 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

请帮我解决这个问题,我想知道充气城堡 API 中是否有任何 class 可以做到这一点...???

如有任何帮助,我们将不胜感激。

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

正如我所说,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 天,因为我没有太多关于编码是如何完成的信息。