@@ -12,7 +12,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" /> | <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" /> | ||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | |||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" /> | |||||
<PackageReference Include="xunit" Version="2.4.1" /> | <PackageReference Include="xunit" Version="2.4.1" /> | ||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"> | ||||
<PrivateAssets>all</PrivateAssets> | <PrivateAssets>all</PrivateAssets> | ||||
@@ -180,72 +180,59 @@ namespace JT809.Protocol.MessagePack | |||||
public byte ReadEnd()=> ReadByte(); | public byte ReadEnd()=> ReadByte(); | ||||
public ushort ReadUInt16() | public ushort ReadUInt16() | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(2); | |||||
ushort value = (ushort)((readOnlySpan[0] << 8) | (readOnlySpan[1])); | |||||
return value; | |||||
return BinaryPrimitives.ReadUInt16BigEndian(GetReadOnlySpan(2)); | |||||
} | } | ||||
public ushort ReadUInt16(ReadOnlySpan<byte> buffer) | public ushort ReadUInt16(ReadOnlySpan<byte> buffer) | ||||
{ | { | ||||
return (ushort)((buffer[0] << 8) | (buffer[1])); | |||||
return BinaryPrimitives.ReadUInt16BigEndian(buffer.Slice(0, 2)); | |||||
} | } | ||||
public uint ReadUInt32() | public uint ReadUInt32() | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(4); | |||||
uint value = (uint)((readOnlySpan[0] << 24) | (readOnlySpan[1] << 16) | (readOnlySpan[2] << 8) | readOnlySpan[3]); | |||||
return value; | |||||
return BinaryPrimitives.ReadUInt32BigEndian(GetReadOnlySpan(4)); | |||||
} | } | ||||
public int ReadInt32() | public int ReadInt32() | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(4); | |||||
int value = (int)((readOnlySpan[0] << 24) | (readOnlySpan[1] << 16) | (readOnlySpan[2] << 8) | readOnlySpan[3]); | |||||
return value; | |||||
return BinaryPrimitives.ReadInt32BigEndian(GetReadOnlySpan(4)); | |||||
} | } | ||||
public ulong ReadUInt64() | public ulong ReadUInt64() | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(8); | |||||
ulong value = (ulong)( | |||||
(readOnlySpan[0] << 56) | | |||||
(readOnlySpan[1] << 48) | | |||||
(readOnlySpan[2] << 40) | | |||||
(readOnlySpan[3] << 32) | | |||||
(readOnlySpan[4] << 24) | | |||||
(readOnlySpan[5] << 16) | | |||||
(readOnlySpan[6] << 8) | | |||||
readOnlySpan[7]); | |||||
return value; | |||||
return BinaryPrimitives.ReadUInt64BigEndian(GetReadOnlySpan(8)); | |||||
} | |||||
public long ReadInt64() | |||||
{ | |||||
return BinaryPrimitives.ReadInt64BigEndian(GetReadOnlySpan(8)); | |||||
} | } | ||||
public byte ReadByte() | public byte ReadByte() | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(1); | |||||
return readOnlySpan[0]; | |||||
return GetReadOnlySpan(1)[0]; | |||||
} | } | ||||
public byte ReadVirtualByte() | public byte ReadVirtualByte() | ||||
{ | { | ||||
var readOnlySpan = GetVirtualReadOnlySpan(1); | |||||
return readOnlySpan[0]; | |||||
return GetVirtualReadOnlySpan(1)[0]; | |||||
} | } | ||||
public ushort ReadVirtualUInt16() | public ushort ReadVirtualUInt16() | ||||
{ | { | ||||
var readOnlySpan = GetVirtualReadOnlySpan(2); | |||||
return (ushort)((readOnlySpan[0] << 8) | (readOnlySpan[1])); | |||||
return BinaryPrimitives.ReadUInt16BigEndian(GetVirtualReadOnlySpan(2)); | |||||
} | |||||
public short ReadVirtualInt16() | |||||
{ | |||||
return BinaryPrimitives.ReadInt16BigEndian(GetVirtualReadOnlySpan(2)); | |||||
} | } | ||||
public uint ReadVirtualUInt32() | public uint ReadVirtualUInt32() | ||||
{ | { | ||||
var readOnlySpan = GetVirtualReadOnlySpan(4); | |||||
return (uint)((readOnlySpan[0] << 24) | (readOnlySpan[1] << 16) | (readOnlySpan[2] << 8) | readOnlySpan[3]); | |||||
return BinaryPrimitives.ReadUInt32BigEndian(GetVirtualReadOnlySpan(4)); | |||||
} | |||||
public int ReadVirtualInt32() | |||||
{ | |||||
return BinaryPrimitives.ReadInt32BigEndian(GetVirtualReadOnlySpan(4)); | |||||
} | } | ||||
public ulong ReadVirtualUInt64() | public ulong ReadVirtualUInt64() | ||||
{ | { | ||||
var readOnlySpan = GetVirtualReadOnlySpan(8); | |||||
return (ulong)( | |||||
(readOnlySpan[0] << 56) | | |||||
(readOnlySpan[1] << 48) | | |||||
(readOnlySpan[2] << 40) | | |||||
(readOnlySpan[3] << 32) | | |||||
(readOnlySpan[4] << 24) | | |||||
(readOnlySpan[5] << 16) | | |||||
(readOnlySpan[6] << 8) | | |||||
readOnlySpan[7]); | |||||
return BinaryPrimitives.ReadUInt64BigEndian(GetVirtualReadOnlySpan(8)); | |||||
} | |||||
public long ReadVirtualInt64() | |||||
{ | |||||
return BinaryPrimitives.ReadInt64BigEndian(GetVirtualReadOnlySpan(8)); | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// 数字编码 大端模式、高位在前 | /// 数字编码 大端模式、高位在前 | ||||
@@ -264,8 +251,7 @@ namespace JT809.Protocol.MessagePack | |||||
} | } | ||||
public ReadOnlySpan<byte> ReadArray(int len) | public ReadOnlySpan<byte> ReadArray(int len) | ||||
{ | { | ||||
var readOnlySpan = GetReadOnlySpan(len); | |||||
return readOnlySpan.Slice(0, len); | |||||
return GetReadOnlySpan(len).Slice(0, len); | |||||
} | } | ||||
public ReadOnlySpan<byte> ReadArray(int start,int end) | public ReadOnlySpan<byte> ReadArray(int start,int end) | ||||
{ | { | ||||
@@ -61,41 +61,33 @@ namespace JT809.Protocol.MessagePack | |||||
} | } | ||||
public void WriteUInt16(ushort value) | public void WriteUInt16(ushort value) | ||||
{ | { | ||||
var span = writer.Free; | |||||
span[0] = (byte)(value >> 8); | |||||
span[1] = (byte)value; | |||||
BinaryPrimitives.WriteUInt16BigEndian(writer.Free, value); | |||||
writer.Advance(2); | |||||
} | |||||
public void WriteInt16(short value) | |||||
{ | |||||
BinaryPrimitives.WriteInt16BigEndian(writer.Free, value); | |||||
writer.Advance(2); | writer.Advance(2); | ||||
} | } | ||||
public void WriteInt32(int value) | public void WriteInt32(int value) | ||||
{ | { | ||||
var span = writer.Free; | |||||
span[0] = (byte)(value >> 24); | |||||
span[1] = (byte)(value >> 16); | |||||
span[2] = (byte)(value >> 8); | |||||
span[3] = (byte)value; | |||||
BinaryPrimitives.WriteInt32BigEndian(writer.Free, value); | |||||
writer.Advance(4); | |||||
} | |||||
public void WriteUInt32(uint value) | |||||
{ | |||||
BinaryPrimitives.WriteUInt32BigEndian(writer.Free, value); | |||||
writer.Advance(4); | writer.Advance(4); | ||||
} | } | ||||
public void WriteUInt64(ulong value) | public void WriteUInt64(ulong value) | ||||
{ | { | ||||
var span = writer.Free; | |||||
span[0] = (byte)(value >> 56); | |||||
span[1] = (byte)(value >> 48); | |||||
span[2] = (byte)(value >> 40); | |||||
span[3] = (byte)(value >> 32); | |||||
span[4] = (byte)(value >> 24); | |||||
span[5] = (byte)(value >> 16); | |||||
span[6] = (byte)(value >> 8); | |||||
span[7] = (byte)value; | |||||
BinaryPrimitives.WriteUInt64BigEndian(writer.Free, value); | |||||
writer.Advance(8); | writer.Advance(8); | ||||
} | } | ||||
public void WriteUInt32(uint value) | |||||
public void WriteInt64(long value) | |||||
{ | { | ||||
var span = writer.Free; | |||||
span[0] = (byte)(value >> 24); | |||||
span[1] = (byte)(value >> 16); | |||||
span[2] = (byte)(value >> 8); | |||||
span[3] = (byte)value; | |||||
writer.Advance(4); | |||||
BinaryPrimitives.WriteInt64BigEndian(writer.Free, value); | |||||
writer.Advance(8); | |||||
} | } | ||||
public void WriteStringPadLeft(string value, int len) | public void WriteStringPadLeft(string value, int len) | ||||
{ | { | ||||
@@ -152,22 +144,27 @@ namespace JT809.Protocol.MessagePack | |||||
} | } | ||||
public void WriteUInt16Return(ushort value, int position) | public void WriteUInt16Return(ushort value, int position) | ||||
{ | { | ||||
writer.Written[position] = (byte)(value >> 8); | |||||
writer.Written[position + 1] = (byte)value; | |||||
BinaryPrimitives.WriteUInt16BigEndian(writer.Written.Slice(position,2), value); | |||||
} | |||||
public void WriteInt16Return(short value, int position) | |||||
{ | |||||
BinaryPrimitives.WriteInt16BigEndian(writer.Written.Slice(position, 2), value); | |||||
} | } | ||||
public void WriteInt32Return(int value, int position) | public void WriteInt32Return(int value, int position) | ||||
{ | { | ||||
writer.Written[position] = (byte)(value >> 24); | |||||
writer.Written[position + 1] = (byte)(value >> 16); | |||||
writer.Written[position + 2] = (byte)(value >> 8); | |||||
writer.Written[position + 3] = (byte)value; | |||||
BinaryPrimitives.WriteInt32BigEndian(writer.Written.Slice(position, 4), value); | |||||
} | } | ||||
public void WriteUInt32Return(uint value, int position) | public void WriteUInt32Return(uint value, int position) | ||||
{ | { | ||||
writer.Written[position] = (byte)(value >> 24); | |||||
writer.Written[position + 1] = (byte)(value >> 16); | |||||
writer.Written[position + 2] = (byte)(value >> 8); | |||||
writer.Written[position + 3] = (byte)value; | |||||
BinaryPrimitives.WriteUInt32BigEndian(writer.Written.Slice(position, 4), value); | |||||
} | |||||
public void WriteInt64Return(long value, int position) | |||||
{ | |||||
BinaryPrimitives.WriteInt64BigEndian(writer.Written.Slice(position, 8), value); | |||||
} | |||||
public void WriteUInt64Return(ulong value, int position) | |||||
{ | |||||
BinaryPrimitives.WriteUInt64BigEndian(writer.Written.Slice(position, 8), value); | |||||
} | } | ||||
public void WriteByteReturn(byte value, int position) | public void WriteByteReturn(byte value, int position) | ||||
{ | { | ||||
@@ -193,19 +190,12 @@ namespace JT809.Protocol.MessagePack | |||||
} | } | ||||
public void WriteStringReturn(string value, int position) | public void WriteStringReturn(string value, int position) | ||||
{ | { | ||||
byte[] codeBytes = JT809Constants.Encoding.GetBytes(value); | |||||
for (var i = 0; i < codeBytes.Length; i++) | |||||
{ | |||||
writer.Written[position + i] = codeBytes[i]; | |||||
} | |||||
Span<byte> codeBytes = JT809Constants.Encoding.GetBytes(value); | |||||
codeBytes.CopyTo(writer.Written.Slice(position)); | |||||
} | } | ||||
public void WriteArrayReturn(ReadOnlySpan<byte> src, int position) | public void WriteArrayReturn(ReadOnlySpan<byte> src, int position) | ||||
{ | { | ||||
foreach (var item in src) | |||||
{ | |||||
writer.Written[position] = item; | |||||
position++; | |||||
} | |||||
src.CopyTo(writer.Written.Slice(position)); | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
/// yyMMddHHmmss | /// yyMMddHHmmss | ||||