瀏覽代碼

fix ReadUInt16Little

pull/1/head
zwq00000 4 年之前
父節點
當前提交
7c11c930af
共有 6 個文件被更改,包括 93 次插入75 次删除
  1. +1
    -0
      .gitignore
  2. +1
    -1
      src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj
  3. +28
    -0
      src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs
  4. +3
    -1
      src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs
  5. +58
    -71
      src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs
  6. +2
    -2
      src/JTNE.Protocol/JTNEGlobalConfigs.cs

+ 1
- 0
.gitignore 查看文件

@@ -26,6 +26,7 @@ bld/


# Visual Studio 2015 cache/options directory # Visual Studio 2015 cache/options directory
.vs/ .vs/
.vscode/
# Uncomment if you have tasks that create the project's static files in wwwroot # Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/ #wwwroot/




+ 1
- 1
src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj 查看文件

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">


<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netcoreapp2.2;net472</TargetFrameworks>
<TargetFrameworks>netcoreapp2.2</TargetFrameworks>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<StartupObject /> <StartupObject />
</PropertyGroup> </PropertyGroup>


+ 28
- 0
src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs 查看文件

@@ -1,15 +1,24 @@
using JTNE.Protocol.Enums; using JTNE.Protocol.Enums;
using JTNE.Protocol.Extensions; using JTNE.Protocol.Extensions;
using JTNE.Protocol.MessageBody; using JTNE.Protocol.MessageBody;
using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Xunit; using Xunit;
using Xunit.Abstractions;


namespace JTNE.Protocol.Test namespace JTNE.Protocol.Test
{ {
public class JTNEHeaderPackageTest public class JTNEHeaderPackageTest
{ {
private readonly ITestOutputHelper output;

public JTNEHeaderPackageTest(ITestOutputHelper outputHelper)
{
this.output = outputHelper;
}

[Fact] [Fact]
public void Test1() public void Test1()
{ {
@@ -51,5 +60,24 @@ namespace JTNE.Protocol.Test
Assert.Equal("4567", jTNE_0X01.BatteryNos[1]); Assert.Equal("4567", jTNE_0X01.BatteryNos[1]);
Assert.Equal("9870", jTNE_0X01.BatteryNos[2]); 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<JTNE_0x05>(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);

}
} }
} }

+ 3
- 1
src/JTNE.Protocol/Extensions/JTNEBinaryExtensions.cs 查看文件

@@ -1,4 +1,5 @@
using System; using System;
using System.Buffers.Binary;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;


@@ -22,7 +23,8 @@ namespace JTNE.Protocol.Extensions


public static ushort ReadUInt16Little(ReadOnlySpan<byte> read, ref int offset) public static ushort ReadUInt16Little(ReadOnlySpan<byte> 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; offset = offset + 2;
return value; return value;
} }


+ 58
- 71
src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs 查看文件

@@ -3,16 +3,14 @@ using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;


namespace JTNE.Protocol.Extensions
{
public static partial class JTNEBinaryExtensions
{
namespace JTNE.Protocol.Extensions {
public static partial class JTNEBinaryExtensions {
/// <summary> /// <summary>
/// 日期限制于2000年 /// 日期限制于2000年
/// </summary> /// </summary>
private const int DateLimitYear = 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);


/// <summary> /// <summary>
/// ///
@@ -21,21 +19,23 @@ namespace JTNE.Protocol.Extensions
/// <param name="offset"></param> /// <param name="offset"></param>
/// <param name="format">D2: 10 X2:16</param> /// <param name="format">D2: 10 X2:16</param>
/// <returns></returns> /// <returns></returns>
public static DateTime ReadDateTime6Little(ReadOnlySpan<byte> buf, ref int offset,string format= "D2")
{
public static DateTime ReadDateTime6Little (ReadOnlySpan<byte> buf, ref int offset, string format = "D2") {
DateTime d = UTCBaseTime; 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; d = UTCBaseTime;
} }
offset = offset + 6; offset = offset + 6;
@@ -49,34 +49,28 @@ namespace JTNE.Protocol.Extensions
/// <param name="offset"></param> /// <param name="offset"></param>
/// <param name="format">D2: 10 X2:16</param> /// <param name="format">D2: 10 X2:16</param>
/// <returns></returns> /// <returns></returns>
public static DateTime ReadDateTime4Little(ReadOnlySpan<byte> buf, ref int offset, string format = "D2")
{
public static DateTime ReadDateTime4Little (ReadOnlySpan<byte> buf, ref int offset, string format = "D2") {
DateTime d = UTCBaseTime; 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; d = UTCBaseTime;
} }
offset = offset + 4; offset = offset + 4;
return d; return d;
} }


public static DateTime ReadUTCDateTimeLittle(ReadOnlySpan<byte> buf, ref int offset)
{
public static DateTime ReadUTCDateTimeLittle (ReadOnlySpan<byte> buf, ref int offset) {
ulong result = 0; 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; result += currentData;
} }
offset += 8; offset += 8;
return UTCBaseTime.AddSeconds(result).AddHours(8);
return UTCBaseTime.AddSeconds (result).AddHours (8);
} }
/// <summary> /// <summary>
/// hh-mm-ss-msms /// hh-mm-ss-msms
@@ -86,28 +80,25 @@ namespace JTNE.Protocol.Extensions
/// <param name="offset"></param> /// <param name="offset"></param>
/// <param name="format"></param> /// <param name="format"></param>
/// <returns></returns> /// <returns></returns>
public static DateTime ReadDateTime5Little(ReadOnlySpan<byte> buf, ref int offset, string format = "D2")
{
public static DateTime ReadDateTime5Little (ReadOnlySpan<byte> buf, ref int offset, string format = "D2") {


DateTime dateTime = new DateTime(
DateTime dateTime = new DateTime (
DateTime.Now.Year, DateTime.Now.Year,
DateTime.Now.Month, DateTime.Now.Month,
DateTime.Now.Day, 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])); ((buf[offset + 3] << 8) + buf[offset + 4]));
offset = offset + 5; offset = offset + 5;
return dateTime; 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; totalSecends = totalSecends >> 8;
} }
return 8; return 8;
@@ -119,16 +110,14 @@ namespace JTNE.Protocol.Extensions
/// <param name="memoryOwner"></param> /// <param name="memoryOwner"></param>
/// <param name="offset"></param> /// <param name="offset"></param>
/// <param name="date"></param> /// <param name="date"></param>
/// <param name="fromBase">BCD:10 HEX:16</param>
/// <returns></returns> /// <returns></returns>
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; return 6;
} }


@@ -140,12 +129,11 @@ namespace JTNE.Protocol.Extensions
/// <param name="date"></param> /// <param name="date"></param>
/// <param name="fromBase">BCD:10 HEX:16</param> /// <param name="fromBase">BCD:10 HEX:16</param>
/// <returns></returns> /// <returns></returns>
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; return 4;
} }
/// <summary> /// <summary>
@@ -157,14 +145,13 @@ namespace JTNE.Protocol.Extensions
/// <param name="date"></param> /// <param name="date"></param>
/// <param name="fromBase"></param> /// <param name="fromBase"></param>
/// <returns></returns> /// <returns></returns>
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; return 5;
} }
} }
}
}

+ 2
- 2
src/JTNE.Protocol/JTNEGlobalConfigs.cs 查看文件

@@ -16,13 +16,13 @@ namespace JTNE.Protocol
private JTNEGlobalConfigs() private JTNEGlobalConfigs()
{ {
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding = Encoding.UTF8;
Encoding = Encoding.GetEncoding("GB18030");
SkipCRCCode = false; SkipCRCCode = false;
DeviceMsgSNDistributed = new DefaultDeviceMsgSNDistributedImpl(); DeviceMsgSNDistributed = new DefaultDeviceMsgSNDistributedImpl();
PlatformMsgSNDistributed = new DefaultPlatformMsgSNDistributedImpl(); PlatformMsgSNDistributed = new DefaultPlatformMsgSNDistributedImpl();
} }
/// <summary> /// <summary>
/// 字符串编码
/// 字符串编码,默认 GB18030
/// </summary> /// </summary>
public Encoding Encoding { get; } public Encoding Encoding { get; }




Loading…
取消
儲存