@@ -12,7 +12,7 @@ | |||
<ItemGroup> | |||
<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.runner.visualstudio" Version="2.4.1"> | |||
<PrivateAssets>all</PrivateAssets> | |||
@@ -180,72 +180,59 @@ namespace JT809.Protocol.MessagePack | |||
public byte ReadEnd()=> ReadByte(); | |||
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) | |||
{ | |||
return (ushort)((buffer[0] << 8) | (buffer[1])); | |||
return BinaryPrimitives.ReadUInt16BigEndian(buffer.Slice(0, 2)); | |||
} | |||
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() | |||
{ | |||
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() | |||
{ | |||
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() | |||
{ | |||
var readOnlySpan = GetReadOnlySpan(1); | |||
return readOnlySpan[0]; | |||
return GetReadOnlySpan(1)[0]; | |||
} | |||
public byte ReadVirtualByte() | |||
{ | |||
var readOnlySpan = GetVirtualReadOnlySpan(1); | |||
return readOnlySpan[0]; | |||
return GetVirtualReadOnlySpan(1)[0]; | |||
} | |||
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() | |||
{ | |||
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() | |||
{ | |||
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> | |||
/// 数字编码 大端模式、高位在前 | |||
@@ -264,8 +251,7 @@ namespace JT809.Protocol.MessagePack | |||
} | |||
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) | |||
{ | |||
@@ -61,41 +61,33 @@ namespace JT809.Protocol.MessagePack | |||
} | |||
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); | |||
} | |||
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); | |||
} | |||
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); | |||
} | |||
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) | |||
{ | |||
@@ -152,22 +144,27 @@ namespace JT809.Protocol.MessagePack | |||
} | |||
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) | |||
{ | |||
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) | |||
{ | |||
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) | |||
{ | |||
@@ -193,19 +190,12 @@ namespace JT809.Protocol.MessagePack | |||
} | |||
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) | |||
{ | |||
foreach (var item in src) | |||
{ | |||
writer.Written[position] = item; | |||
position++; | |||
} | |||
src.CopyTo(writer.Written.Slice(position)); | |||
} | |||
/// <summary> | |||
/// yyMMddHHmmss | |||