@@ -73,6 +73,19 @@ namespace JT808.Protocol.Test.MessagePack | |||
Assert.Equal(JT808Package.EndFlag, jT808MessagePackReader.ReadEnd()); | |||
} | |||
[Fact] | |||
public void ReadDateTimeNullTest() | |||
{ | |||
byte[] bytes = "7E0000000000000000000000000000007E".ToHexBytes(); | |||
JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); | |||
Assert.Equal(JT808Package.BeginFlag, jT808MessagePackReader.ReadStart()); | |||
Assert.Null(jT808MessagePackReader.ReadDateTimeNull4()); | |||
Assert.Null(jT808MessagePackReader.ReadDateTimeNull5()); | |||
Assert.Null(jT808MessagePackReader.ReadDateTimeNull6()); | |||
Assert.Equal(JT808Package.EndFlag, jT808MessagePackReader.ReadEnd()); | |||
} | |||
[Theory] | |||
[InlineData("smallchi(Koike)")] | |||
public void ReadStringTest(string str) | |||
@@ -77,6 +77,25 @@ namespace JT808.Protocol.Test.MessagePack | |||
Assert.Equal("7E2019061923232301231906192323237E7E2019061923232301231906192323237E", realBytes); | |||
} | |||
[Fact] | |||
public void WriteDateTimeNullTest() | |||
{ | |||
byte[] array = new byte[4096]; | |||
var msgpackWriter = new JT808MessagePackWriter(array); | |||
msgpackWriter.WriteStart(); | |||
msgpackWriter.WriteDateTime4(null); | |||
msgpackWriter.WriteDateTime5(null); | |||
msgpackWriter.WriteDateTime6(null); | |||
msgpackWriter.WriteEnd(); | |||
msgpackWriter.WriteEncode(); | |||
//===========output========= | |||
//WriteDateTime4=>YYYYMMDD=>00 00 00 00 | |||
//WriteDateTime5=>HH-mm-ss-fff|HH-mm-ss-msms=>00 00 00 00 00 | |||
//WriteDateTime6=>yyMMddHHmmss=>00 00 00 00 | |||
var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString(); | |||
Assert.Equal("7E0000000000000000000000000000007E".Replace(" ", ""), encodeBytes); | |||
} | |||
[Fact] | |||
public void WriteUTCDateTimeTest() | |||
{ | |||
@@ -59,12 +59,12 @@ | |||
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" /> | |||
<PackageReference Include="System.Memory" Version="4.5.4" /> | |||
<PackageReference Include="System.Reflection.Extensions" Version="4.3.0" /> | |||
<PackageReference Include="System.Text.Json" Version="5.0.0" /> | |||
<PackageReference Include="System.Text.Json" Version="5.0.1" /> | |||
</ItemGroup> | |||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' "> | |||
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> | |||
<PackageReference Include="System.Text.Json" Version="5.0.0" /> | |||
<PackageReference Include="System.Text.Json" Version="5.0.1" /> | |||
</ItemGroup> | |||
<ItemGroup Condition=" '$(TargetFramework)' == 'net5' "> | |||
@@ -8012,6 +8012,12 @@ | |||
</summary> | |||
<param name="fromBase">>D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackReader.ReadDateTimeNull6(System.String)"> | |||
<summary> | |||
yyMMddHHmmss | |||
</summary> | |||
<param name="fromBase">>D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackReader.ReadDateTime5(System.String)"> | |||
<summary> | |||
HH-mm-ss-msms | |||
@@ -8019,18 +8025,37 @@ | |||
</summary> | |||
<param name="format">D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackReader.ReadDateTimeNull5(System.String)"> | |||
<summary> | |||
HH-mm-ss-msms | |||
HH-mm-ss-fff | |||
</summary> | |||
<param name="format">D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackReader.ReadDateTime4(System.String)"> | |||
<summary> | |||
YYYYMMDD | |||
</summary> | |||
<param name="format">D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackReader.ReadDateTimeNull4(System.String)"> | |||
<summary> | |||
YYYYMMDD | |||
</summary> | |||
<param name="format">D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackReader.ReadDateTime3(System.String)"> | |||
<summary> | |||
YYMMDD | |||
</summary> | |||
<param name="format">D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackReader.ReadDateTimeNull3(System.String)"> | |||
<summary> | |||
YYMMDD | |||
</summary> | |||
<param name="format">D2: 10 X2:16</param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime6(System.DateTime,System.Int32)"> | |||
<summary> | |||
yyMMddHHmmss | |||
@@ -8038,6 +8063,13 @@ | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime6(System.Nullable{System.DateTime},System.Int32)"> | |||
<summary> | |||
yyMMddHHmmss | |||
</summary> | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime5(System.DateTime,System.Int32)"> | |||
<summary> | |||
HH-mm-ss-msms | |||
@@ -8046,6 +8078,14 @@ | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime5(System.Nullable{System.DateTime},System.Int32)"> | |||
<summary> | |||
HH-mm-ss-msms | |||
HH-mm-ss-fff | |||
</summary> | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime4(System.DateTime,System.Int32)"> | |||
<summary> | |||
YYYYMMDD | |||
@@ -8055,6 +8095,15 @@ | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime4(System.Nullable{System.DateTime},System.Int32)"> | |||
<summary> | |||
YYYYMMDD | |||
BCD[4] | |||
数据形如:20200101 | |||
</summary> | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime3(System.DateTime,System.Int32)"> | |||
<summary> | |||
YYMMDD | |||
@@ -8064,6 +8113,15 @@ | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteDateTime3(System.Nullable{System.DateTime},System.Int32)"> | |||
<summary> | |||
YYMMDD | |||
BCD[4] | |||
数据形如:20200101 | |||
</summary> | |||
<param name="value"></param> | |||
<param name="fromBase"></param> | |||
</member> | |||
<member name="M:JT808.Protocol.MessagePack.JT808MessagePackWriter.WriteBigNumber(System.String,System.Int32)"> | |||
<summary> | |||
数字编码 大端模式、高位在前 | |||
@@ -263,6 +263,31 @@ namespace JT808.Protocol.MessagePack | |||
return d; | |||
} | |||
/// <summary> | |||
/// yyMMddHHmmss | |||
/// </summary> | |||
/// <param name="fromBase">>D2: 10 X2:16</param> | |||
public DateTime? ReadDateTimeNull6(string format = "X2") | |||
{ | |||
DateTime? d; | |||
try | |||
{ | |||
var readOnlySpan = GetReadOnlySpan(6); | |||
int year = Convert.ToInt32(readOnlySpan[0].ToString(format)) ; | |||
int month = Convert.ToInt32(readOnlySpan[1].ToString(format)); | |||
int day = Convert.ToInt32(readOnlySpan[2].ToString(format)); | |||
int hour = Convert.ToInt32(readOnlySpan[3].ToString(format)); | |||
int minute = Convert.ToInt32(readOnlySpan[4].ToString(format)); | |||
int second = Convert.ToInt32(readOnlySpan[5].ToString(format)); | |||
if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) return null; | |||
d = new DateTime(year + JT808Constants.DateLimitYear, month, day, hour, minute, second); | |||
} | |||
catch (Exception) | |||
{ | |||
return null; | |||
} | |||
return d; | |||
} | |||
/// <summary> | |||
/// HH-mm-ss-msms | |||
/// HH-mm-ss-fff | |||
/// </summary> | |||
@@ -274,8 +299,8 @@ namespace JT808.Protocol.MessagePack | |||
{ | |||
var readOnlySpan = GetReadOnlySpan(5); | |||
StringBuilder sb = new StringBuilder(4); | |||
sb.Append(readOnlySpan[3].ToString("X2")); | |||
sb.Append(readOnlySpan[4].ToString("X2")); | |||
sb.Append(readOnlySpan[3].ToString(format)); | |||
sb.Append(readOnlySpan[4].ToString(format)); | |||
d = new DateTime( | |||
DateTime.Now.Year, | |||
DateTime.Now.Month, | |||
@@ -292,6 +317,40 @@ namespace JT808.Protocol.MessagePack | |||
return d; | |||
} | |||
/// <summary> | |||
/// HH-mm-ss-msms | |||
/// HH-mm-ss-fff | |||
/// </summary> | |||
/// <param name="format">D2: 10 X2:16</param> | |||
public DateTime? ReadDateTimeNull5(string format = "X2") | |||
{ | |||
DateTime? d; | |||
try | |||
{ | |||
var readOnlySpan = GetReadOnlySpan(5); | |||
StringBuilder sb = new StringBuilder(4); | |||
sb.Append(readOnlySpan[3].ToString("X2")); | |||
sb.Append(readOnlySpan[4].ToString("X2")); | |||
int hour = Convert.ToInt32(readOnlySpan[0].ToString(format)); | |||
int minute = Convert.ToInt32(readOnlySpan[1].ToString(format)); | |||
int second = Convert.ToInt32(readOnlySpan[2].ToString(format)); | |||
int millisecond = Convert.ToInt32(sb.ToString().TrimStart()); | |||
if (hour == 0 && minute == 0 && second == 0 && millisecond == 0) return null; | |||
d = new DateTime( | |||
DateTime.Now.Year, | |||
DateTime.Now.Month, | |||
DateTime.Now.Day, | |||
hour, | |||
minute, | |||
second, | |||
millisecond); | |||
} | |||
catch | |||
{ | |||
return null; | |||
} | |||
return d; | |||
} | |||
/// <summary> | |||
/// YYYYMMDD | |||
/// </summary> | |||
/// <param name="format">D2: 10 X2:16</param> | |||
@@ -302,8 +361,8 @@ namespace JT808.Protocol.MessagePack | |||
{ | |||
var readOnlySpan = GetReadOnlySpan(4); | |||
StringBuilder sb = new StringBuilder(4); | |||
sb.Append(readOnlySpan[0].ToString("X2")); | |||
sb.Append(readOnlySpan[1].ToString("X2")); | |||
sb.Append(readOnlySpan[0].ToString(format)); | |||
sb.Append(readOnlySpan[1].ToString(format)); | |||
d = new DateTime( | |||
Convert.ToInt32(sb.ToString()), | |||
Convert.ToInt32(readOnlySpan[2].ToString(format)), | |||
@@ -316,6 +375,31 @@ namespace JT808.Protocol.MessagePack | |||
return d; | |||
} | |||
/// <summary> | |||
/// YYYYMMDD | |||
/// </summary> | |||
/// <param name="format">D2: 10 X2:16</param> | |||
public DateTime? ReadDateTimeNull4(string format = "X2") | |||
{ | |||
DateTime? d; | |||
try | |||
{ | |||
var readOnlySpan = GetReadOnlySpan(4); | |||
StringBuilder sb = new StringBuilder(4); | |||
sb.Append(readOnlySpan[0].ToString(format)); | |||
sb.Append(readOnlySpan[1].ToString(format)); | |||
int year = Convert.ToInt32(sb.ToString()); | |||
int month = Convert.ToInt32(readOnlySpan[2].ToString(format)); | |||
int day = Convert.ToInt32(readOnlySpan[3].ToString(format)); | |||
if (year == 0 && month == 0 && day == 0) return null; | |||
d = new DateTime(year, month, day); | |||
} | |||
catch (Exception) | |||
{ | |||
return null; | |||
} | |||
return d; | |||
} | |||
/// <summary> | |||
/// YYMMDD | |||
/// </summary> | |||
/// <param name="format">D2: 10 X2:16</param> | |||
@@ -336,6 +420,30 @@ namespace JT808.Protocol.MessagePack | |||
} | |||
return d; | |||
} | |||
/// <summary> | |||
/// YYMMDD | |||
/// </summary> | |||
/// <param name="format">D2: 10 X2:16</param> | |||
public DateTime? ReadDateTimeNull3(string format = "X2") | |||
{ | |||
DateTime? d; | |||
try | |||
{ | |||
var readOnlySpan = GetReadOnlySpan(3); | |||
int year =Convert.ToInt32(readOnlySpan[0].ToString(format)); | |||
int month=Convert.ToInt32(readOnlySpan[1].ToString(format)); | |||
int day = Convert.ToInt32(readOnlySpan[2].ToString(format)); | |||
if (year == 0 && month == 0 && day == 0) return null; | |||
d = new DateTime( | |||
year + JT808Constants.DateLimitYear, month,day | |||
); | |||
} | |||
catch (Exception) | |||
{ | |||
d = JT808Constants.UTCBaseTime; | |||
} | |||
return d; | |||
} | |||
public DateTime ReadUTCDateTime() | |||
{ | |||
DateTime d; | |||
@@ -172,6 +172,34 @@ namespace JT808.Protocol.MessagePack | |||
writer.Advance(6); | |||
} | |||
/// <summary> | |||
/// yyMMddHHmmss | |||
/// </summary> | |||
/// <param name="value"></param> | |||
/// <param name="fromBase"></param> | |||
public void WriteDateTime6(DateTime? value, int fromBase = 16) | |||
{ | |||
var span = writer.Free; | |||
if (value == null || value.HasValue) | |||
{ | |||
span[0] = 0; | |||
span[1] = 0; | |||
span[2] = 0; | |||
span[3] = 0; | |||
span[4] = 0; | |||
span[5] = 0; | |||
} | |||
else | |||
{ | |||
span[0] = Convert.ToByte(value.Value.ToString("yy"), fromBase); | |||
span[1] = Convert.ToByte(value.Value.ToString("MM"), fromBase); | |||
span[2] = Convert.ToByte(value.Value.ToString("dd"), fromBase); | |||
span[3] = Convert.ToByte(value.Value.ToString("HH"), fromBase); | |||
span[4] = Convert.ToByte(value.Value.ToString("mm"), fromBase); | |||
span[5] = Convert.ToByte(value.Value.ToString("ss"), fromBase); | |||
} | |||
writer.Advance(6); | |||
} | |||
/// <summary> | |||
/// HH-mm-ss-msms | |||
/// HH-mm-ss-fff | |||
/// </summary> | |||
@@ -188,6 +216,34 @@ namespace JT808.Protocol.MessagePack | |||
span[4] = Convert.ToByte(msSpan.Slice(2, 2).ToString(), fromBase); | |||
writer.Advance(5); | |||
} | |||
/// <summary> | |||
/// HH-mm-ss-msms | |||
/// HH-mm-ss-fff | |||
/// </summary> | |||
/// <param name="value"></param> | |||
/// <param name="fromBase"></param> | |||
public void WriteDateTime5(DateTime? value, int fromBase = 16) | |||
{ | |||
var span = writer.Free; | |||
if (value == null || value.HasValue) | |||
{ | |||
span[0] = 0; | |||
span[1] = 0; | |||
span[2] = 0; | |||
span[3] = 0; | |||
span[4] = 0; | |||
} | |||
else | |||
{ | |||
span[0] = Convert.ToByte(value.Value.ToString("HH"), fromBase); | |||
span[1] = Convert.ToByte(value.Value.ToString("mm"), fromBase); | |||
span[2] = Convert.ToByte(value.Value.ToString("ss"), fromBase); | |||
var msSpan = value.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) | |||
{ | |||
ulong totalSecends = (ulong)(value.AddHours(-8) - JT808Constants.UTCBaseTime).TotalSeconds; | |||
@@ -217,6 +273,35 @@ namespace JT808.Protocol.MessagePack | |||
span[3] = Convert.ToByte(value.ToString("dd"), fromBase); | |||
writer.Advance(4); | |||
} | |||
/// <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; | |||
if (value==null || value.HasValue) | |||
{ | |||
span[0] = 0; | |||
span[1] = 0; | |||
span[2] = 0; | |||
span[3] = 0; | |||
} | |||
else | |||
{ | |||
var yearSpan = value.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.Value.ToString("MM"), fromBase); | |||
span[3] = Convert.ToByte(value.Value.ToString("dd"), fromBase); | |||
} | |||
writer.Advance(4); | |||
} | |||
/// <summary> | |||
/// YYMMDD | |||
/// BCD[4] | |||
@@ -232,6 +317,31 @@ namespace JT808.Protocol.MessagePack | |||
span[2] = Convert.ToByte(value.ToString("dd"), fromBase); | |||
writer.Advance(3); | |||
} | |||
/// <summary> | |||
/// YYMMDD | |||
/// BCD[4] | |||
/// 数据形如:20200101 | |||
/// </summary> | |||
/// <param name="value"></param> | |||
/// <param name="fromBase"></param> | |||
public void WriteDateTime3(DateTime? value, int fromBase = 16) | |||
{ | |||
var span = writer.Free; | |||
if (value == null || value.HasValue) | |||
{ | |||
span[0] = 0; | |||
span[1] = 0; | |||
span[2] = 0; | |||
} | |||
else | |||
{ | |||
span[0] = Convert.ToByte(value.Value.ToString("yy"), fromBase); | |||
span[1] = Convert.ToByte(value.Value.ToString("MM"), fromBase); | |||
span[2] = Convert.ToByte(value.Value.ToString("dd"), fromBase); | |||
} | |||
writer.Advance(3); | |||
} | |||
public void WriteXor(int start, int end) | |||
{ | |||
if (start > end) | |||