@@ -67,14 +67,14 @@ namespace JT808.Protocol.Test.MessageBody | |||||
CertificateExpiresDate = DateTime.Parse("2018-08-16") | CertificateExpiresDate = DateTime.Parse("2018-08-16") | ||||
}; | }; | ||||
var hex = JT808Serializer.Serialize(jT808_0X0702).ToHexString(); | 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] | [Fact] | ||||
public void Test3_1() | 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); | JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes); | ||||
Assert.Equal(JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班, jT808_0X0702.IC_Card_Status); | Assert.Equal(JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班, jT808_0X0702.IC_Card_Status); | ||||
Assert.Equal(DateTime.Parse("2018-08-16 09:16:16"), jT808_0X0702.IC_Card_PlugDateTime); | 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" | DriverIdentityCard="12345678901234567" | ||||
}; | }; | ||||
var hex = JT808Serializer.Serialize(jT808_0X0702, JT808Version.JTT2019).ToHexString(); | var hex = JT808Serializer.Serialize(jT808_0X0702, JT808Version.JTT2019).ToHexString(); | ||||
Assert.Equal("0119120111111100056B6F696B6571776531323334353661616130303030303030300671776572747807E312013132333435363738393031323334353637303030", hex); | |||||
Assert.Equal("0119120111111100056B6F696B65717765313233343536616161303030303030303006717765727478201912013132333435363738393031323334353637303030", hex); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public void Test_2019_2() | public void Test_2019_2() | ||||
{ | { | ||||
byte[] bytes = "0119120111111100056B6F696B6571776531323334353661616130303030303030300671776572747807E312013132333435363738393031323334353637303030".ToHexBytes(); | |||||
byte[] bytes = "0119120111111100056B6F696B65717765313233343536616161303030303030303006717765727478201912013132333435363738393031323334353637303030".ToHexBytes(); | |||||
JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes, JT808Version.JTT2019); | JT808_0x0702 jT808_0X0702 = JT808Serializer.Deserialize<JT808_0x0702>(bytes, JT808Version.JTT2019); | ||||
Assert.Equal(JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班, jT808_0X0702.IC_Card_Status); | Assert.Equal(JT808ICCardStatus.从业资格证IC卡插入_驾驶员上班, jT808_0X0702.IC_Card_Status); | ||||
Assert.Equal(DateTime.Parse("2019-12-01 11:11:11"), jT808_0X0702.IC_Card_PlugDateTime); | Assert.Equal(DateTime.Parse("2019-12-01 11:11:11"), jT808_0X0702.IC_Card_PlugDateTime); | ||||
@@ -29,13 +29,13 @@ namespace JT808.Protocol.Test.MessageBody | |||||
CanData = new byte[] { 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01 }, | CanData = new byte[] { 0x01, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01 }, | ||||
}); | }); | ||||
var hex = JT808Serializer.Serialize(jT808_0X0705).ToHexString(); | var hex = JT808Serializer.Serialize(jT808_0X0705).ToHexString(); | ||||
Assert.Equal("0002200005015E001203040102030401020304050607080103040506070801", hex); | |||||
Assert.Equal("00022000050350001203040102030401020304050607080103040506070801", hex); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public void Test2() | public void Test2() | ||||
{ | { | ||||
byte[] bytes = "0002200005015E001203040102030401020304050607080103040506070801".ToHexBytes(); | |||||
byte[] bytes = "00022000050350001203040102030401020304050607080103040506070801".ToHexBytes(); | |||||
JT808_0x0705 jT808_0X0705 = JT808Serializer.Deserialize<JT808_0x0705>(bytes); | JT808_0x0705 jT808_0X0705 = JT808Serializer.Deserialize<JT808_0x0705>(bytes); | ||||
Assert.Equal(2, jT808_0X0705.CanItemCount); | Assert.Equal(2, jT808_0X0705.CanItemCount); | ||||
@@ -64,7 +64,7 @@ namespace JT808.Protocol.Test.MessagePack | |||||
[Fact] | [Fact] | ||||
public void ReadDateTimeTest() | 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); | JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); | ||||
Assert.Equal(JT808Package.BeginFlag, jT808MessagePackReader.ReadStart()); | Assert.Equal(JT808Package.BeginFlag, jT808MessagePackReader.ReadStart()); | ||||
Assert.Equal(DateTime.Parse("2019-06-19"), jT808MessagePackReader.ReadDateTime4()); | Assert.Equal(DateTime.Parse("2019-06-19"), jT808MessagePackReader.ReadDateTime4()); | ||||
@@ -64,17 +64,17 @@ namespace JT808.Protocol.Test.MessagePack | |||||
msgpackWriter.WriteEnd(); | msgpackWriter.WriteEnd(); | ||||
msgpackWriter.WriteEncode(); | msgpackWriter.WriteEncode(); | ||||
//===========output========= | //===========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 | //WriteDateTime6=>yyMMddHHmmss=>19 23 23 23 | ||||
//Unencode: | //Unencode: | ||||
//7E 07 E3 06 19 23 23 23 00 7B 19 06 19 23 23 23 7E | |||||
//7E2019061923232312301906192323237E | |||||
//Encode | //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(); | var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString(); | ||||
Assert.Equal("7E07E30619232323007B1906192323237E".Replace(" ", ""), encodeBytes); | |||||
Assert.Equal("7E2019061923232301231906192323237E".Replace(" ", ""), encodeBytes); | |||||
var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString(); | var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString(); | ||||
Assert.Equal("7E07E30619232323007B1906192323237E7E07E30619232323007B1906192323237E", realBytes); | |||||
Assert.Equal("7E2019061923232301231906192323237E7E2019061923232301231906192323237E", realBytes); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
@@ -6754,6 +6754,8 @@ | |||||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime4(System.DateTime,System.Int32)"> | <member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime4(System.DateTime,System.Int32)"> | ||||
<summary> | <summary> | ||||
YYYYMMDD | YYYYMMDD | ||||
BCD[4] | |||||
数据形如:20200101 | |||||
</summary> | </summary> | ||||
<param name="value"></param> | <param name="value"></param> | ||||
<param name="fromBase"></param> | <param name="fromBase"></param> | ||||
@@ -6,6 +6,7 @@ using System; | |||||
using System.Buffers; | using System.Buffers; | ||||
using System.Buffers.Binary; | using System.Buffers.Binary; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | |||||
using System.Runtime.CompilerServices; | using System.Runtime.CompilerServices; | ||||
using System.Text; | using System.Text; | ||||
@@ -269,6 +270,9 @@ namespace JT808.Protocol.MessagePack | |||||
try | try | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(5); | var readOnlySpan = GetReadOnlySpan(5); | ||||
StringBuilder sb = new StringBuilder(4); | |||||
sb.Append(readOnlySpan[3].ToString("X2")); | |||||
sb.Append(readOnlySpan[4].ToString("X2")); | |||||
d = new DateTime( | d = new DateTime( | ||||
DateTime.Now.Year, | DateTime.Now.Year, | ||||
DateTime.Now.Month, | DateTime.Now.Month, | ||||
@@ -276,7 +280,7 @@ namespace JT808.Protocol.MessagePack | |||||
Convert.ToInt32(readOnlySpan[0].ToString(format)), | Convert.ToInt32(readOnlySpan[0].ToString(format)), | ||||
Convert.ToInt32(readOnlySpan[1].ToString(format)), | Convert.ToInt32(readOnlySpan[1].ToString(format)), | ||||
Convert.ToInt32(readOnlySpan[2].ToString(format)), | Convert.ToInt32(readOnlySpan[2].ToString(format)), | ||||
Convert.ToInt32(((readOnlySpan[3] << 8) + readOnlySpan[4]))); | |||||
Convert.ToInt32(sb.ToString().TrimStart())); | |||||
} | } | ||||
catch | catch | ||||
{ | { | ||||
@@ -294,8 +298,11 @@ namespace JT808.Protocol.MessagePack | |||||
try | try | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(4); | var readOnlySpan = GetReadOnlySpan(4); | ||||
StringBuilder sb = new StringBuilder(4); | |||||
sb.Append(readOnlySpan[0].ToString("X2")); | |||||
sb.Append(readOnlySpan[1].ToString("X2")); | |||||
d = new DateTime( | 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[2].ToString(format)), | ||||
Convert.ToInt32(readOnlySpan[3].ToString(format))); | Convert.ToInt32(readOnlySpan[3].ToString(format))); | ||||
} | } | ||||
@@ -177,8 +177,9 @@ namespace JT808.Protocol.MessagePack | |||||
span[0] = Convert.ToByte(value.ToString("HH"), fromBase); | span[0] = Convert.ToByte(value.ToString("HH"), fromBase); | ||||
span[1] = Convert.ToByte(value.ToString("mm"), fromBase); | span[1] = Convert.ToByte(value.ToString("mm"), fromBase); | ||||
span[2] = Convert.ToByte(value.ToString("ss"), 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); | writer.Advance(5); | ||||
} | } | ||||
public void WriteUTCDateTime(DateTime value) | public void WriteUTCDateTime(DateTime value) | ||||
@@ -195,14 +196,17 @@ namespace JT808.Protocol.MessagePack | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// YYYYMMDD | /// YYYYMMDD | ||||
/// BCD[4] | |||||
/// 数据形如:20200101 | |||||
/// </summary> | /// </summary> | ||||
/// <param name="value"></param> | /// <param name="value"></param> | ||||
/// <param name="fromBase"></param> | /// <param name="fromBase"></param> | ||||
public void WriteDateTime4(DateTime value, int fromBase = 16) | public void WriteDateTime4(DateTime value, int fromBase = 16) | ||||
{ | { | ||||
var span = writer.Free; | 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[2] = Convert.ToByte(value.ToString("MM"), fromBase); | ||||
span[3] = Convert.ToByte(value.ToString("dd"), fromBase); | span[3] = Convert.ToByte(value.ToString("dd"), fromBase); | ||||
writer.Advance(4); | writer.Advance(4); | ||||