嗨我有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
任何帮助将不胜感激。
答案 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天,因为我没有太多关于如何编码的信息。