From 5add5a7881281069c9618cdbf6c49b8592d13481 Mon Sep 17 00:00:00 2001
From: "SmallChi(Koike)" <564952747@qq.com>
Date: Tue, 14 Jan 2020 00:24:21 +0800
Subject: [PATCH] =?UTF-8?q?1.=E6=84=9F=E8=B0=A2=E5=A5=8B=E6=96=97=E5=9C=A8?=
 =?UTF-8?q?=E5=8C=97=E4=BA=AC=E8=BF=87=E6=A3=80=E7=9A=84=E5=A4=A7=E5=85=84?=
 =?UTF-8?q?=E5=BC=9F=E5=B8=AE=E5=BF=99=E6=8C=87=E5=87=BA=202.=E4=BF=AE?=
 =?UTF-8?q?=E5=A4=8D0702=E3=80=810705=E6=97=B6=E9=97=B4=E7=9A=84BCD?=
 =?UTF-8?q?=E5=A4=84=E7=90=86=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../MessageBody/JT808_0x0702Test.cs                  | 10 +++++-----
 .../MessageBody/JT808_0x0705Test.cs                  |  4 ++--
 .../MessagePack/JT808MessagePackReaderTest.cs        |  2 +-
 .../MessagePack/JT808MessagePackWriterTest.cs        | 12 ++++++------
 src/JT808.Protocol/JT808.Protocol.xml                |  2 ++
 .../MessagePack/JT808MessagePackReader.cs            | 11 +++++++++--
 .../MessagePack/JT808MessagePackWriter.cs            | 12 ++++++++----
 7 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs
index bfeb216..5c3cbe3 100644
--- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs
+++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0702Test.cs
@@ -67,14 +67,14 @@ namespace JT808.Protocol.Test.MessageBody
                 CertificateExpiresDate = DateTime.Parse("2018-08-16")
             };
             var hex = JT808Serializer.Serialize(jT808_0X0702).ToHexString();
-            Assert.Equal("01 18 08 16 09 16 16 00 05 6B 6F 69 6B 65 71 77 65 31 32 33 34 35 36 61 61 61 30 30 30 30 30 30 30 30 06 71 77 65 72 74 78 07 E2 08 16".Replace(" ", ""), hex);
-            //"01 18 08 16 09 16 16 00 05 6B 6F 69 6B 65 71 77 65 31 32 33 34 35 36 61 61 61 30 30 30 30 30 30 30 30 06 71 77 65 72 74 78 07 E2 08 16"
+            Assert.Equal("01 18 08 16 09 16 16 00 05 6B 6F 69 6B 65 71 77 65 31 32 33 34 35 36 61 61 61 30 30 30 30 30 30 30 30 06 71 77 65 72 74 78 20 18 08 16".Replace(" ", ""), hex);
+            //"01 18 08 16 09 16 16 00 05 6B 6F 69 6B 65 71 77 65 31 32 33 34 35 36 61 61 61 30 30 30 30 30 30 30 30 06 71 77 65 72 74 78 20 18 08 16"
         }
 
         [Fact]
         public void Test3_1()
         {
-            byte[] bytes = "01 18 08 16 09 16 16 00 05 6B 6F 69 6B 65 71 77 65 31 32 33 34 35 36 61 61 61 30 30 30 30 30 30 30 30 06 71 77 65 72 74 78 07 E2 08 16".ToHexBytes();
+            byte[] bytes = "01 18 08 16 09 16 16 00 05 6B 6F 69 6B 65 71 77 65 31 32 33 34 35 36 61 61 61 30 30 30 30 30 30 30 30 06 71 77 65 72 74 78 20 18 08 16".ToHexBytes();
             JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes);
             Assert.Equal(JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班, jT808_0X0702.IC_Card_Status);
             Assert.Equal(DateTime.Parse("2018-08-16 09:16:16"), jT808_0X0702.IC_Card_PlugDateTime);
@@ -100,14 +100,14 @@ namespace JT808.Protocol.Test.MessageBody
                 DriverIdentityCard="12345678901234567"
             };
             var hex = JT808Serializer.Serialize(jT808_0X0702, JT808Version.JTT2019).ToHexString();
-            Assert.Equal("0119120111111100056B6F696B6571776531323334353661616130303030303030300671776572747807E312013132333435363738393031323334353637303030", hex);
+            Assert.Equal("0119120111111100056B6F696B65717765313233343536616161303030303030303006717765727478201912013132333435363738393031323334353637303030", hex);
             
         }
 
         [Fact]
         public void Test_2019_2()
         {
-            byte[] bytes = "0119120111111100056B6F696B6571776531323334353661616130303030303030300671776572747807E312013132333435363738393031323334353637303030".ToHexBytes();
+            byte[] bytes = "0119120111111100056B6F696B65717765313233343536616161303030303030303006717765727478201912013132333435363738393031323334353637303030".ToHexBytes();
             JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes, JT808Version.JTT2019);
             Assert.Equal(JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班, jT808_0X0702.IC_Card_Status);
             Assert.Equal(DateTime.Parse("2019-12-01 11:11:11"), jT808_0X0702.IC_Card_PlugDateTime);
diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x0705Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x0705Test.cs
index f2762b7..5d76557 100644
--- a/src/JT808.Protocol.Test/MessageBody/JT808_0x0705Test.cs
+++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x0705Test.cs
@@ -29,13 +29,13 @@ namespace JT808.Protocol.Test.MessageBody
                 CanData = new byte[] { 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01 },
             });
             var hex = JT808Serializer.Serialize(jT808_0X0705).ToHexString();
-            Assert.Equal("0002200005015E001203040102030401020304050607080103040506070801", hex);
+            Assert.Equal("00022000050350001203040102030401020304050607080103040506070801", hex);
         }
 
         [Fact]
         public void Test2()
         {
-            byte[] bytes = "0002200005015E001203040102030401020304050607080103040506070801".ToHexBytes();
+            byte[] bytes = "00022000050350001203040102030401020304050607080103040506070801".ToHexBytes();
             JT808_0x0705 jT808_0X0705 = JT808Serializer.Deserialize<JT808_0x0705>(bytes);
 
             Assert.Equal(2, jT808_0X0705.CanItemCount);
diff --git a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs
index be981c4..248e545 100644
--- a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs
+++ b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs
@@ -64,7 +64,7 @@ namespace JT808.Protocol.Test.MessagePack
         [Fact]
         public void ReadDateTimeTest()
         {
-            byte[] bytes = "7E 07 E3 06 19 23 23 23 00 7B 19 06 19 23 23 23 7E".ToHexBytes();
+            byte[] bytes = "7E2019061923232301231906192323237E".ToHexBytes();
             JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes);
             Assert.Equal(JT808Package.BeginFlag, jT808MessagePackReader.ReadStart());
             Assert.Equal(DateTime.Parse("2019-06-19"), jT808MessagePackReader.ReadDateTime4());
diff --git a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs
index 10c87c7..ff72ea3 100644
--- a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs
+++ b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs
@@ -64,17 +64,17 @@ namespace JT808.Protocol.Test.MessagePack
             msgpackWriter.WriteEnd();
             msgpackWriter.WriteEncode();
             //===========output=========
-            //WriteDateTime4=>YYYYMMDD=>07 E3 06 19
-            //WriteDateTime5=>HH-mm-ss-fff|HH-mm-ss-msms=>23 23 23 00 7B
+            //WriteDateTime4=>YYYYMMDD=>20 19 06 19
+            //WriteDateTime5=>HH-mm-ss-fff|HH-mm-ss-msms=>23 23 23 01 23
             //WriteDateTime6=>yyMMddHHmmss=>19 23 23 23
             //Unencode:
-            //7E 07 E3 06 19 23 23 23 00 7B 19 06 19 23 23 23 7E
+            //7E2019061923232312301906192323237E
             //Encode
-            //7E 07 E3 06 19 23 23 23 00 7B 19 06 19 23 23 23 7E
+            //7E 20 19 06 19 23 23 23 01 23 19 06 19 23 23 23 7E
             var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
-            Assert.Equal("7E07E30619232323007B1906192323237E".Replace(" ", ""), encodeBytes);
+            Assert.Equal("7E2019061923232301231906192323237E".Replace(" ", ""), encodeBytes);
             var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
-            Assert.Equal("7E07E30619232323007B1906192323237E7E07E30619232323007B1906192323237E", realBytes);
+            Assert.Equal("7E2019061923232301231906192323237E7E2019061923232301231906192323237E", realBytes);
         }
 
         [Fact]
diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml
index aa40d13..f146066 100644
--- a/src/JT808.Protocol/JT808.Protocol.xml
+++ b/src/JT808.Protocol/JT808.Protocol.xml
@@ -6754,6 +6754,8 @@
         <member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime4(System.DateTime,System.Int32)">
             <summary>
             YYYYMMDD
+            BCD[4]
+            数据形如:20200101
             </summary>
             <param name="value"></param>
             <param name="fromBase"></param>
diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs
index 3778b97..80d2b84 100644
--- a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs
+++ b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs
@@ -6,6 +6,7 @@ using System;
 using System.Buffers;
 using System.Buffers.Binary;
 using System.Collections.Generic;
+using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Text;
 
@@ -269,6 +270,9 @@ namespace JT808.Protocol.MessagePack
             try
             {
                 var readOnlySpan = GetReadOnlySpan(5);
+                StringBuilder sb = new StringBuilder(4);
+                sb.Append(readOnlySpan[3].ToString("X2"));
+                sb.Append(readOnlySpan[4].ToString("X2"));
                 d = new DateTime(
                 DateTime.Now.Year,
                 DateTime.Now.Month,
@@ -276,7 +280,7 @@ namespace JT808.Protocol.MessagePack
                 Convert.ToInt32(readOnlySpan[0].ToString(format)),
                 Convert.ToInt32(readOnlySpan[1].ToString(format)),
                 Convert.ToInt32(readOnlySpan[2].ToString(format)),
-                Convert.ToInt32(((readOnlySpan[3] << 8) + readOnlySpan[4])));
+                Convert.ToInt32(sb.ToString().TrimStart()));
             }
             catch
             {
@@ -294,8 +298,11 @@ namespace JT808.Protocol.MessagePack
             try
             {
                 var readOnlySpan = GetReadOnlySpan(4);
+                StringBuilder sb = new StringBuilder(4);
+                sb.Append(readOnlySpan[0].ToString("X2"));
+                sb.Append(readOnlySpan[1].ToString("X2"));
                 d = new DateTime(
-               (Convert.ToInt32(readOnlySpan[0].ToString(format)) << 8) + Convert.ToByte(readOnlySpan[1]),
+                Convert.ToInt32(sb.ToString()),
                 Convert.ToInt32(readOnlySpan[2].ToString(format)),
                 Convert.ToInt32(readOnlySpan[3].ToString(format)));
             }
diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs
index eb8dad6..54cf4c1 100644
--- a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs
+++ b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs
@@ -177,8 +177,9 @@ namespace JT808.Protocol.MessagePack
             span[0] = Convert.ToByte(value.ToString("HH"), fromBase);
             span[1] = Convert.ToByte(value.ToString("mm"), fromBase);
             span[2] = Convert.ToByte(value.ToString("ss"), fromBase);
-            span[3] = (byte)(value.Millisecond >> 8);
-            span[4] = (byte)(value.Millisecond);
+            var msSpan = value.Millisecond.ToString().PadLeft(4,'0').AsSpan();
+            span[3] = Convert.ToByte(msSpan.Slice(0, 2).ToString(), fromBase);
+            span[4] = Convert.ToByte(msSpan.Slice(2, 2).ToString(), fromBase);
             writer.Advance(5);
         }
         public void WriteUTCDateTime(DateTime value)
@@ -195,14 +196,17 @@ namespace JT808.Protocol.MessagePack
         }
         /// <summary>
         /// YYYYMMDD
+        /// BCD[4]
+        /// 数据形如:20200101
         /// </summary>
         /// <param name="value"></param>
         /// <param name="fromBase"></param>
         public void WriteDateTime4(DateTime value, int fromBase = 16)
         {
             var span = writer.Free;
-            span[0] = (byte)(value.Year >> 8);
-            span[1] = (byte)(value.Year);
+            var yearSpan=value.ToString("yyyy").AsSpan();
+            span[0] = Convert.ToByte(yearSpan.Slice(0, 2).ToString(), fromBase);
+            span[1] = Convert.ToByte(yearSpan.Slice(2, 2).ToString(), fromBase);
             span[2] = Convert.ToByte(value.ToString("MM"), fromBase);
             span[3] = Convert.ToByte(value.ToString("dd"), fromBase);
             writer.Advance(4);