Ver a proveniência

fix ReadUInt16Little

pull/1/head
zwq00000 há 4 anos
ascendente
cometimento
7c11c930af
6 ficheiros alterados com 93 adições e 75 eliminações
  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 Ver ficheiro

@@ -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/



+ 1
- 1
src/JTNE.Protocol.Benchmark/JTNE.Protocol.Benchmark.csproj Ver ficheiro

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

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


+ 28
- 0
src/JTNE.Protocol.Test/JTNEHeaderPackageTest.cs Ver ficheiro

@@ -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<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 Ver ficheiro

@@ -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<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;
return value;
}


+ 58
- 71
src/JTNE.Protocol/Extensions/JTNEDateTimeExtensions.cs Ver ficheiro

@@ -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 {
/// <summary>
/// 日期限制于2000年
/// </summary>
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>
///
@@ -21,21 +19,23 @@ namespace JTNE.Protocol.Extensions
/// <param name="offset"></param>
/// <param name="format">D2: 10 X2:16</param>
/// <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;
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
/// <param name="offset"></param>
/// <param name="format">D2: 10 X2:16</param>
/// <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;
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<byte> buf, ref int offset)
{
public static DateTime ReadUTCDateTimeLittle (ReadOnlySpan<byte> 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);
}
/// <summary>
/// hh-mm-ss-msms
@@ -86,28 +80,25 @@ namespace JTNE.Protocol.Extensions
/// <param name="offset"></param>
/// <param name="format"></param>
/// <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.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
/// <param name="memoryOwner"></param>
/// <param name="offset"></param>
/// <param name="date"></param>
/// <param name="fromBase">BCD:10 HEX:16</param>
/// <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;
}

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

+ 2
- 2
src/JTNE.Protocol/JTNEGlobalConfigs.cs Ver ficheiro

@@ -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();
}
/// <summary>
/// 字符串编码
/// 字符串编码,默认 GB18030
/// </summary>
public Encoding Encoding { get; }



Carregando…
Cancelar
Guardar