From ce20bde2f63a63823c643eb52df131919ea1d556 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Tue, 7 Apr 2020 18:15:43 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E8=A1=8C=E8=BD=A6=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E4=BB=AA=E5=88=86=E6=9E=90=E5=99=A8=202.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0char=E5=92=8Cstring=E7=9A=84=E8=AF=BB=E5=86=99?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MessagePack/JT808MessagePackReaderTest.cs | 20 +++++++++++ .../MessagePack/JT808MessagePackWriterTest.cs | 10 ++++++ src/JT808.Protocol.Test/Simples/Demo9.cs | 34 +++++++++++++++---- src/JT808.Protocol/JT808CarDVRSerializer.cs | 21 +++++++----- .../MessagePack/JT808MessagePackReader.cs | 17 ++++++++++ .../MessagePack/JT808MessagePackWriter.cs | 15 +++++++- 6 files changed, 100 insertions(+), 17 deletions(-) diff --git a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs index 248e545..e61483d 100644 --- a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs +++ b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackReaderTest.cs @@ -238,6 +238,26 @@ namespace JT808.Protocol.Test.MessagePack Assert.Equal(JT808Version.JTT2013, reader.Version); reader.Version = JT808Version.JTT2019; Assert.Equal(JT808Version.JTT2019, reader.Version); + } + + [Fact] + public void ReadStringEndChar0Test1() + { + byte[] array = "736D616C6C636869286B6F696B652900".ToHexBytes(); + var reader = new JT808MessagePackReader(array); + var str = reader.ReadStringEndChar0(); + Assert.Equal("smallchi(koike)", str); + Assert.Equal(16, reader.ReaderCount); + } + + [Fact] + public void ReadVirtualArrayEndChar0Test1() + { + byte[] array = "736D616C6C636869286B6F696B652900".ToHexBytes(); + var reader = new JT808MessagePackReader(array); + var str = reader.ReadVirtualStringEndChar0(); + Assert.Equal("smallchi(koike)", str); + Assert.Equal(0, reader.ReaderCount); } } } diff --git a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs index a43aaec..51415cb 100644 --- a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs +++ b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs @@ -480,5 +480,15 @@ namespace JT808.Protocol.Test.MessagePack BinaryPrimitives.WriteUInt16BigEndian(array2, (ushort)a); Assert.Equal(array1, array2); } + + [Fact] + public void WriteStringEndChar0Test() + { + byte[] array = new byte[22]; + var msgpackWriter = new JT808MessagePackWriter(array); + msgpackWriter.WriteStringEndChar0("smallchi(koike)"); + var hex = msgpackWriter.FlushAndGetEncodingArray().ToHexString(); + Assert.Equal("736D616C6C636869286B6F696B652900", hex); + } } } diff --git a/src/JT808.Protocol.Test/Simples/Demo9.cs b/src/JT808.Protocol.Test/Simples/Demo9.cs index 427e9a3..19badce 100644 --- a/src/JT808.Protocol.Test/Simples/Demo9.cs +++ b/src/JT808.Protocol.Test/Simples/Demo9.cs @@ -53,15 +53,27 @@ namespace JT808.Protocol.Test.Simples [Fact] public void Test3() + { + JT808CarDVRDownPackage jT808CarDVRDownPackage = new JT808CarDVRDownPackage(); + jT808CarDVRDownPackage.CommandId = JT808CarDVRCommandID.设置初始里程.ToByteValue(); + jT808CarDVRDownPackage.Bodies = new JT808_CarDVR_Down_0xC4() + { + FirstInstallTime = DateTime.Parse("2020-03-25 10:26:01"), + FirstMileage = "1234", + RealTime = DateTime.Parse("2020-03-25 10:26:01"), + TotalMilage = "123456" + }; + byte[] downData = JT808CarDVRSerializer.Serialize(jT808CarDVRDownPackage); + var downHex = downData.ToHexString(); + Assert.Equal("557AC40014002003251026012003251026010000123400123456A9", downHex); + } + + [Fact] + public void Test3_1() { var data = "557AC40014002003251026012003251026010000123400123456A9".ToHexBytes(); - JT808CarDVRDownPackage jT808CarDVRDownPackage = JT808CarDVRSerializer.DownDeserialize(data); - Assert.Equal(JT808CarDVRCommandID.设置初始里程.ToByteValue(), jT808CarDVRDownPackage.CommandId); - var value = jT808CarDVRDownPackage.Bodies as JT808_CarDVR_Down_0xC4; - Assert.Equal(DateTime.Parse("2020-03-25 10:26:01"), value.FirstInstallTime); - Assert.Equal(DateTime.Parse("2020-03-25 10:26:01"), value.RealTime); - Assert.Equal("1234", value.FirstMileage); - Assert.Equal("123456", value.TotalMilage); + string json1 = JT808CarDVRSerializer.Analyze(data); + string json2 = JT808CarDVRSerializer.DownAnalyze(data); } [Fact] @@ -80,6 +92,14 @@ namespace JT808.Protocol.Test.Simples [Fact] public void Test5() + { + var data = "557AC4000000EB".ToHexBytes(); + string json1 = JT808CarDVRSerializer.Analyze(data); + string json2 = JT808CarDVRSerializer.UpAnalyze(data); + } + + [Fact] + public void Test5_1() { var data = "557AC4000000EB".ToHexBytes(); JT808CarDVRUpPackage package = JT808CarDVRSerializer.UpDeserialize(data); diff --git a/src/JT808.Protocol/JT808CarDVRSerializer.cs b/src/JT808.Protocol/JT808CarDVRSerializer.cs index 91b2079..566e303 100644 --- a/src/JT808.Protocol/JT808CarDVRSerializer.cs +++ b/src/JT808.Protocol/JT808CarDVRSerializer.cs @@ -155,7 +155,9 @@ namespace JT808.Protocol using(MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { + utf8JsonWriter.WriteStartObject(); JT808CarDVRUpPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); + utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); string value = Encoding.UTF8.GetString(memoryStream.ToArray()); return value; @@ -168,7 +170,9 @@ namespace JT808.Protocol using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { + utf8JsonWriter.WriteStartObject(); JT808CarDVRDownPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); + utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); string value = Encoding.UTF8.GetString(memoryStream.ToArray()); return value; @@ -182,9 +186,9 @@ namespace JT808.Protocol using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { - if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteStartObject(); + utf8JsonWriter.WriteStartObject(); analyze.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); - if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteEndObject(); + utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); string value = Encoding.UTF8.GetString(memoryStream.ToArray()); return value; @@ -197,7 +201,9 @@ namespace JT808.Protocol using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { + utf8JsonWriter.WriteStartObject(); JT808CarDVRUpPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); + utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); return memoryStream.ToArray(); } @@ -209,7 +215,9 @@ namespace JT808.Protocol using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { + utf8JsonWriter.WriteStartObject(); JT808CarDVRDownPackage.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); + utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); return memoryStream.ToArray(); } @@ -222,17 +230,12 @@ namespace JT808.Protocol using (MemoryStream memoryStream = new MemoryStream()) using (Utf8JsonWriter utf8JsonWriter = new Utf8JsonWriter(memoryStream, options)) { - if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteStartObject(); + utf8JsonWriter.WriteStartObject(); analyze.Analyze(ref jT808MessagePackReader, utf8JsonWriter, jT808Config); - if (!CheckPackageType(typeof(T))) utf8JsonWriter.WriteEndObject(); + utf8JsonWriter.WriteEndObject(); utf8JsonWriter.Flush(); return memoryStream.ToArray(); } } - - private static bool CheckPackageType(Type type) - { - return type == typeof(JT808CarDVRUpPackage) || type == typeof(JT808CarDVRDownPackage); - } } } diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs index e9180e6..1639a8f 100644 --- a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs +++ b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs @@ -157,6 +157,10 @@ namespace JT808.Protocol.MessagePack { return GetReadOnlySpan(1)[0]; } + public char ReadChar() + { + return (char)GetReadOnlySpan(1)[0]; + } public byte ReadVirtualByte() { return GetVirtualReadOnlySpan(1)[0]; @@ -396,6 +400,19 @@ namespace JT808.Protocol.MessagePack return Reader.Slice(ReaderCount); } } + public string ReadStringEndChar0() + { + var remainSpans = Reader.Slice(ReaderCount, ReadCurrentRemainContentLength()); + int length = remainSpans.IndexOf((byte)'\0') + 1; + string value = JT808Constants.Encoding.GetString(ReadArray(length).ToArray()); + return value.Trim('\0'); + } + public string ReadVirtualStringEndChar0() + { + var remainSpans = Reader.Slice(ReaderCount); + string value = JT808Constants.Encoding.GetString(GetVirtualReadOnlySpan(remainSpans.IndexOf((byte)'\0') + 1).ToArray()); + return value.Trim('\0'); + } public int ReadCurrentRemainContentLength() { if (_decoded) diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs index 44db316..fee1854 100644 --- a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs +++ b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs @@ -64,6 +64,12 @@ namespace JT808.Protocol.MessagePack } writer.Advance(count); } + public void WriteChar(char value) + { + var span = writer.Free; + span[0] = (byte)value; + writer.Advance(1); + } public void WriteByte(byte value) { var span = writer.Free; @@ -399,11 +405,18 @@ namespace JT808.Protocol.MessagePack } writer.Advance(len); } + + public void WriteStringEndChar0(string value) + { + WriteString(value); + WriteChar('\0'); + } + public int GetCurrentPosition() { return writer.WrittenCount; } - public void WriteCarDVRCheckCode(int currentPosition) + public void WriteCarDVRCheckCode(int currentPosition) { var carDVRPackage = writer.Written.Slice(currentPosition, writer.WrittenCount- currentPosition); byte calculateXorCheckCode = 0;