From 7c11c930af3bcf7d606c5c7ad19829221cbd6c44 Mon Sep 17 00:00:00 2001 From: zwq00000 Date: Tue, 21 Jul 2020 11:45:30 +0800 Subject: [PATCH] fix ReadUInt16Little --- .gitignore | 1 + .../JTNE.Protocol.Benchmark.csproj | 2 +- .../JTNEHeaderPackageTest.cs | 28 ++++ .../Extensions/JTNEBinaryExtensions.cs | 4 +- .../Extensions/JTNEDateTimeExtensions.cs | 129 ++++++++---------- src/JTNE.Protocol/JTNEGlobalConfigs.cs | 4 +- 6 files changed, 93 insertions(+), 75 deletions(-) diff --git a/.gitignore b/.gitignore index 940794e..42fa0b7 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ bld/ # Visual Studio 2015 cache/options directory .vs/ +.vscode/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ diff --git a/src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj b/src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj index ac9089d..b172e9b 100644 --- a/src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj +++ b/src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj @@ -1,7 +1,7 @@  - netcoreapp2.2;net472 + netcoreapp2.2 Exe diff --git a/src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs b/src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs index 6c8a0e4..5867915 100644 --- a/src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs +++ b/src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs @@ -1,15 +1,24 @@ using JTNE.Protocol.Enums; using JTNE.Protocol.Extensions; using JTNE.Protocol.MessageBody; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Text; using Xunit; +using Xunit.Abstractions; namespace JTNE.Protocol.Test { public class JTNEHeaderPackageTest { + private readonly ITestOutputHelper output; + + public JTNEHeaderPackageTest(ITestOutputHelper outputHelper) + { + this.output = outputHelper; + } + [Fact] public void Test1() { @@ -51,5 +60,24 @@ namespace JTNE.Protocol.Test Assert.Equal("4567", jTNE_0X01.BatteryNos[1]); Assert.Equal("9870", jTNE_0X01.BatteryNos[2]); } + + [Fact] + public void TestGuangtai(){ + var data = "23 23 05 FE 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 31 31 01 29 00 14 07 14 13 26 22 00 01 CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB CD FE BA A3 B9 E3 CC A9 BF D5 B8 DB B3 B5 C1 AA CD F2 01 02 01 A1".ToHexBytes(); + var package = JTNESerializer.Deserialize(data); + Assert.Equal(JTNEAskId.CMD.ToByteValue(), package.AskId); + Assert.Equal(JTNEMsgId.platformlogin.ToByteValue(), package.MsgId); + Assert.Equal(41,package.DataUnitLength); + Assert.NotNull(package.Bodies); + + Assert.IsType(package.Bodies); + + output.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(package.Bodies,Formatting.Indented)); + + var loginbody = (JTNE_0x05) package.Bodies; + Assert.Equal("威海广泰空港",loginbody.PlatformUserName); + Assert.Equal(256,loginbody.LoginNum); + + } } } diff --git a/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs b/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs index 0634756..718b18a 100644 --- a/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs +++ b/src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Buffers.Binary; using System.Collections.Generic; using System.Text; @@ -22,7 +23,8 @@ namespace JTNE.Protocol.Extensions public static ushort ReadUInt16Little(ReadOnlySpan read, ref int offset) { - ushort value = (ushort)((read[offset] << 8) | (read[offset + 1])); + //ushort value = (ushort)((read[offset] << 8) | (read[offset + 1])); + var value = BinaryPrimitives.ReadUInt16LittleEndian(read.Slice(offset,2)); offset = offset + 2; return value; } diff --git a/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs b/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs index 3a9b1d7..8c51102 100644 --- a/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs +++ b/src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs @@ -3,16 +3,14 @@ using System.Buffers; using System.Collections.Generic; using System.Text; -namespace JTNE.Protocol.Extensions -{ - public static partial class JTNEBinaryExtensions - { +namespace JTNE.Protocol.Extensions { + public static partial class JTNEBinaryExtensions { /// /// 日期限制于2000年 /// private const int DateLimitYear = 2000; - private static readonly DateTime UTCBaseTime = new DateTime(1970, 1, 1); + private static readonly DateTime UTCBaseTime = new DateTime (1970, 1, 1); /// /// @@ -21,21 +19,23 @@ namespace JTNE.Protocol.Extensions /// /// D2: 10 X2:16 /// - public static DateTime ReadDateTime6Little(ReadOnlySpan buf, ref int offset,string format= "D2") - { + public static DateTime ReadDateTime6Little (ReadOnlySpan buf, ref int offset, string format = "D2") { DateTime d = UTCBaseTime; - try - { - int year = Convert.ToInt32(buf[offset].ToString(format)) + DateLimitYear; - int month = Convert.ToInt32(buf[offset + 1].ToString(format)); - int day = Convert.ToInt32(buf[offset + 2].ToString(format)); - int hour = Convert.ToInt32(buf[offset + 3].ToString(format)); - int minute = Convert.ToInt32(buf[offset + 4].ToString(format)); - int second = Convert.ToInt32(buf[offset + 5].ToString(format)); - d = new DateTime(year, month, day, hour, minute, second); - } - catch (Exception ex) - { + try { + //int year = Convert.ToInt32(buf[offset].ToString(format)) + DateLimitYear; + // int month = Convert.ToInt32(buf[offset + 1].ToString(format)); + // int day = Convert.ToInt32(buf[offset + 2].ToString(format)); + // int hour = Convert.ToInt32(buf[offset + 3].ToString(format)); + // int minute = Convert.ToInt32(buf[offset + 4].ToString(format)); + // int second = Convert.ToInt32(buf[offset + 5].ToString(format)); + int year = buf[offset] + DateLimitYear; + int month = buf[offset + 1]; + int day = buf[offset + 2]; + int hour = buf[offset + 3]; + int minute = buf[offset + 4]; + int second = buf[offset + 5]; + d = new DateTime (year, month, day, hour, minute, second); + } catch (Exception) { d = UTCBaseTime; } offset = offset + 6; @@ -49,34 +49,28 @@ namespace JTNE.Protocol.Extensions /// /// D2: 10 X2:16 /// - public static DateTime ReadDateTime4Little(ReadOnlySpan buf, ref int offset, string format = "D2") - { + public static DateTime ReadDateTime4Little (ReadOnlySpan buf, ref int offset, string format = "D2") { DateTime d = UTCBaseTime; - try - { - d = new DateTime( - (Convert.ToInt32(buf[offset].ToString(format)) << 8) + Convert.ToByte(buf[offset + 1]), - Convert.ToInt32(buf[offset + 2].ToString(format)), - Convert.ToInt32(buf[offset + 3].ToString(format))); - } - catch (Exception) - { + try { + d = new DateTime ( + (Convert.ToInt32 (buf[offset].ToString (format)) << 8) + Convert.ToByte (buf[offset + 1]), + Convert.ToInt32 (buf[offset + 2].ToString (format)), + Convert.ToInt32 (buf[offset + 3].ToString (format))); + } catch (Exception) { d = UTCBaseTime; } offset = offset + 4; return d; } - public static DateTime ReadUTCDateTimeLittle(ReadOnlySpan buf, ref int offset) - { + public static DateTime ReadUTCDateTimeLittle (ReadOnlySpan buf, ref int offset) { ulong result = 0; - for (int i = 0; i < 8; i++) - { - ulong currentData = (ulong)buf[offset + i] << (8 * (8 - i - 1)); + for (int i = 0; i < 8; i++) { + ulong currentData = (ulong) buf[offset + i] << (8 * (8 - i - 1)); result += currentData; } offset += 8; - return UTCBaseTime.AddSeconds(result).AddHours(8); + return UTCBaseTime.AddSeconds (result).AddHours (8); } /// /// hh-mm-ss-msms @@ -86,28 +80,25 @@ namespace JTNE.Protocol.Extensions /// /// /// - public static DateTime ReadDateTime5Little(ReadOnlySpan buf, ref int offset, string format = "D2") - { + public static DateTime ReadDateTime5Little (ReadOnlySpan buf, ref int offset, string format = "D2") { - DateTime dateTime = new DateTime( + DateTime dateTime = new DateTime ( DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, - Convert.ToInt32(buf[offset].ToString(format)), - Convert.ToInt32(buf[offset + 1].ToString(format)), - Convert.ToInt32(buf[offset + 2].ToString(format)), + Convert.ToInt32 (buf[offset].ToString (format)), + Convert.ToInt32 (buf[offset + 1].ToString (format)), + Convert.ToInt32 (buf[offset + 2].ToString (format)), ((buf[offset + 3] << 8) + buf[offset + 4])); offset = offset + 5; return dateTime; } - public static int WriteUTCDateTimeLittle(byte[] bytes, int offset, DateTime date) - { - ulong totalSecends = (ulong)(date.AddHours(-8) - UTCBaseTime).TotalSeconds; + public static int WriteUTCDateTimeLittle (byte[] bytes, int offset, DateTime date) { + ulong totalSecends = (ulong) (date.AddHours (-8) - UTCBaseTime).TotalSeconds; //高位在前 - for (int i = 7; i >= 0; i--) - { - bytes[offset + i] = (byte)(totalSecends & 0xFF); //取低8位 + for (int i = 7; i >= 0; i--) { + bytes[offset + i] = (byte) (totalSecends & 0xFF); //取低8位 totalSecends = totalSecends >> 8; } return 8; @@ -119,16 +110,14 @@ namespace JTNE.Protocol.Extensions /// /// /// - /// BCD:10 HEX:16 /// - public static int WriteDateTime6Little(byte[] bytes, int offset, DateTime date,int fromBase=10) - { - bytes[offset] = Convert.ToByte(date.ToString("yy"), fromBase); - bytes[offset + 1] = Convert.ToByte(date.ToString("MM"), fromBase); - bytes[offset + 2] = Convert.ToByte(date.ToString("dd"), fromBase); - bytes[offset + 3] = Convert.ToByte(date.ToString("HH"), fromBase); - bytes[offset + 4] = Convert.ToByte(date.ToString("mm"), fromBase); - bytes[offset + 5] = Convert.ToByte(date.ToString("ss"), fromBase); + public static int WriteDateTime6Little (byte[] bytes, int offset, DateTime date) { + bytes[offset] = (byte)(date.Year-DateLimitYear); //Convert.ToByte (date.ToString ("yy"), fromBase); + bytes[offset + 1] = (byte) date.Month; //Convert.ToByte (date.ToString ("MM"), fromBase); + bytes[offset + 2] = (byte) date.Day; //Convert.ToByte (date.ToString ("dd"), fromBase); + bytes[offset + 3] = (byte) date.Hour; //Convert.ToByte (date.ToString ("HH"), fromBase); + bytes[offset + 4] = (byte) date.Minute; //Convert.ToByte (date.ToString ("mm"), fromBase); + bytes[offset + 5] = (byte) date.Second; //Convert.ToByte (date.ToString ("ss"), fromBase); return 6; } @@ -140,12 +129,11 @@ namespace JTNE.Protocol.Extensions /// /// BCD:10 HEX:16 /// - public static int WriteDateTime4Little(byte[] bytes, int offset, DateTime date, int fromBase = 16) - { - bytes[offset] = (byte)(date.Year>>8); - bytes[offset + 1] = (byte)(date.Year); - bytes[offset + 2] = Convert.ToByte(date.ToString("MM"), fromBase); - bytes[offset + 3] = Convert.ToByte(date.ToString("dd"), fromBase); + public static int WriteDateTime4Little (byte[] bytes, int offset, DateTime date, int fromBase = 16) { + bytes[offset] = (byte) (date.Year >> 8); + bytes[offset + 1] = (byte) (date.Year); + bytes[offset + 2] = Convert.ToByte (date.ToString ("MM"), fromBase); + bytes[offset + 3] = Convert.ToByte (date.ToString ("dd"), fromBase); return 4; } /// @@ -157,14 +145,13 @@ namespace JTNE.Protocol.Extensions /// /// /// - public static int WriteDateTime5Little(byte[] bytes, int offset, DateTime date, int fromBase = 16) - { - bytes[offset] = Convert.ToByte(date.ToString("HH"), fromBase); - bytes[offset + 1] = Convert.ToByte(date.ToString("mm"), fromBase); - bytes[offset + 2] = Convert.ToByte(date.ToString("ss"), fromBase); - bytes[offset + 3] = (byte)(date.Millisecond >> 8); - bytes[offset + 4] = (byte)(date.Millisecond); + public static int WriteDateTime5Little (byte[] bytes, int offset, DateTime date, int fromBase = 16) { + bytes[offset] = Convert.ToByte (date.ToString ("HH"), fromBase); + bytes[offset + 1] = Convert.ToByte (date.ToString ("mm"), fromBase); + bytes[offset + 2] = Convert.ToByte (date.ToString ("ss"), fromBase); + bytes[offset + 3] = (byte) (date.Millisecond >> 8); + bytes[offset + 4] = (byte) (date.Millisecond); return 5; } } -} +} \ No newline at end of file diff --git a/src/JTNE.Protocol/JTNEGlobalConfigs.cs b/src/JTNE.Protocol/JTNEGlobalConfigs.cs index 48a5e3e..c3ce772 100644 --- a/src/JTNE.Protocol/JTNEGlobalConfigs.cs +++ b/src/JTNE.Protocol/JTNEGlobalConfigs.cs @@ -16,13 +16,13 @@ namespace JTNE.Protocol private JTNEGlobalConfigs() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - Encoding = Encoding.UTF8; + Encoding = Encoding.GetEncoding("GB18030"); SkipCRCCode = false; DeviceMsgSNDistributed = new DefaultDeviceMsgSNDistributedImpl(); PlatformMsgSNDistributed = new DefaultPlatformMsgSNDistributedImpl(); } /// - /// 字符串编码 + /// 字符串编码,默认 GB18030 /// public Encoding Encoding { get; }