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);