diff --git a/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor b/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor new file mode 100644 index 00000000000..e911c693677 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor @@ -0,0 +1,120 @@ +@page "/socket/data-entity" +@inject IStringLocalizer Localizer + +

@Localizer["DataEntityTitle"]

+

@Localizer["DataEntityDescription"]

+ + +

通过 SocketDataConverterAttribute 类标签与 SocketDataPropertyAttribute + 属性标签可以将通讯数据自动转化为我们系统中需要的业务实体类,示例如下:

+
[SocketDataConverter(Type = typeof(MockEntitySocketDataConverter))]
+class MockEntity
+{
+    [SocketDataProperty(Type = typeof(byte[]), Offset = 0, Length = 5)]
+    public byte[]? Header { get; set; }
+
+    [SocketDataProperty(Type = typeof(byte[]), Offset = 5, Length = 2)]
+    public byte[]? Body { get; set; }
+
+    [SocketDataProperty(Type = typeof(string), Offset = 7, Length = 1, EncodingName = "utf-8")]
+    public string? Value1 { get; set; }
+
+    [SocketDataProperty(Type = typeof(int), Offset = 8, Length = 1)]
+    public int Value2 { get; set; }
+}
+

1. SocketDataConverter 参数说明:

+ +
class MockEntitySocketDataConverter : SocketDataConverterBase<MockEntity>
+{
+    public override bool TryConvertTo(ReadOnlyMemory<byte> data, [NotNullWhen(true)] out MockEntity? entity)
+    {
+        var v = new MockEntity();
+
+        // 调用基类的 Parse 方法即可
+        var ret = Parse(data, v);
+        entity = ret ? v : null;
+        return ret;
+    }
+}
+

Parse 方法也是可以重载自定义实现的,内置实现逻辑如下:

+
protected virtual bool Parse(ReadOnlyMemory<byte> data, TEntity entity)
+{
+    // 使用 SocketDataPropertyAttribute 特性获取数据转换规则
+    var ret = false;
+    if (entity != null)
+    {
+        var properties = entity.GetType().GetProperties().Where(p => p.CanWrite).ToList();
+        foreach (var p in properties)
+        {
+            var attr = p.GetCustomAttribute<SocketDataPropertyAttribute>(false);
+            if (attr != null)
+            {
+                p.SetValue(entity, attr.ConvertTo(data));
+            }
+        }
+        ret = true;
+    }
+    return ret;
+}
+

即遍历所有有 SocketDataPropertyAttribute 标签的属性对其进行过自动赋值

+

2. SocketDataPropertyAttribute 参数说明

+ +

组件库内置了大量数据类型转换器

+ +

自定义数据类型转化器示例

+
[SocketDataConverter(Type = typeof(MockEntitySocketDataConverter))]
+class MockEntity
+{
+    [SocketDataProperty(Type = typeof(byte[]), Offset = 0, Length = 5)]
+    public byte[]? Header { get; set; }
+
+    [SocketDataProperty(Type = typeof(byte[]), Offset = 5, Length = 2)]
+    public byte[]? Body { get; set; }
+
+    [SocketDataProperty(Type = typeof(Foo), Offset = 7, Length = 1, ConverterType = typeof(FooConverter), ConverterParameters = ["test"])]
+    public string? Value1 { get; set; }
+}
+
+class FooConverter(string name) : ISocketDataPropertyConverter
+{
+    public object? Convert(ReadOnlyMemory<byte> data)
+    {
+        return new Foo() { Id = data.Span[0], Name = name };
+    }
+}
+

更多技术细节可以参考以上内置提供的转换器源码

+
diff --git a/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor.cs new file mode 100644 index 00000000000..2808bcc2bd2 --- /dev/null +++ b/src/BootstrapBlazor.Server/Components/Samples/Sockets/DataEntities.razor.cs @@ -0,0 +1,14 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +namespace BootstrapBlazor.Server.Components.Samples.Sockets; + +/// +/// 数据转实体类示例 +/// +public partial class DataEntities +{ + +} diff --git a/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs b/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs index d06f4004bc8..3cef31369fa 100644 --- a/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs +++ b/src/BootstrapBlazor.Server/Extensions/MenusLocalizerExtensions.cs @@ -209,27 +209,29 @@ void AddSocket(DemoMenuItem item) { new() { - IsNew = true, Text = Localizer["SocketManualReceive"], Url = "socket/manual-receive" }, new() { - IsNew = true, Text = Localizer["SocketAutoReceive"], Url = "socket/auto-receive" }, new() { - IsNew = true, Text = Localizer["DataPackageAdapter"], Url = "socket/adapter" }, new() { - IsNew = true, Text = Localizer["SocketAutoConnect"], Url = "socket/auto-connect" + }, + new() + { + IsNew = true, + Text = Localizer["SocketDataEntity"], + Url = "socket/data-entity" } }; AddBadge(item, count: 1); diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index 54c0c64f95d..f47a6dacfcd 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -4841,6 +4841,7 @@ "SocketManualReceive": "Manual Receive", "DataPackageAdapter": "DataPackageAdapter", "SocketAutoConnect": "Reconnect", + "SocketDataEntity": "DataEntity", "NetworkMonitor": "Network Monitor" }, "BootstrapBlazor.Server.Components.Samples.Table.TablesHeader": { @@ -7121,6 +7122,12 @@ "NormalTitle": "Basic usage", "NormalIntro": "Enable automatic reconnection by setting IsAutoReconnect" }, + "BootstrapBlazor.Server.Components.Samples.Sockets.DataEntities": { + "DataEntityTitle": "Socket Auto Entity", + "DataEntityDescription": "After receiving the communication data, it is automatically converted into the entity class required by the business", + "NormalTitle": "Basic usage", + "NormalIntro": "Enable automatic data conversion through the SocketDataConverterAttribute tag" + }, "BootstrapBlazor.Server.Components.Samples.NetworkMonitors": { "NetworkMonitorTitle": "NetworkMonitor", "NetworkMonitorDescription": "Use the browser native API navigator.connection to display the current network status in real time", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index 1e14cd7f276..4518851fa07 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -4841,6 +4841,7 @@ "SocketManualReceive": "手动接收数据", "DataPackageAdapter": "数据处理器", "SocketAutoConnect": "自动重连", + "SocketDataEntity": "通讯数据转实体类", "NetworkMonitor": "网络状态 NetworkMonitor" }, "BootstrapBlazor.Server.Components.Samples.Table.TablesHeader": { @@ -7121,6 +7122,12 @@ "NormalTitle": "基本用法", "NormalIntro": "通过设置 IsAutoReconnect 开启自动重连机制" }, + "BootstrapBlazor.Server.Components.Samples.Sockets.DataEntities": { + "DataEntityTitle": "Socket 数据转化实体类", + "DataEntityDescription": "接收到通讯数据后自动转成业务需要的实体类", + "NormalTitle": "基本用法", + "NormalIntro": "通过 SocketDataConverterAttribute 标签开启数据自动转换功能" + }, "BootstrapBlazor.Server.Components.Samples.NetworkMonitors": { "NetworkMonitorTitle": "NetworkMonitor 网络状态", "NetworkMonitorDescription": "使用浏览器原生 api navigator.connection 实时显示当前网络状态", diff --git a/src/BootstrapBlazor.Server/docs.json b/src/BootstrapBlazor.Server/docs.json index f2dff539944..ba68d8d67e9 100644 --- a/src/BootstrapBlazor.Server/docs.json +++ b/src/BootstrapBlazor.Server/docs.json @@ -247,6 +247,7 @@ "socket/auto-receive": "Sockets\\AutoReceives", "socket/adapter": "Sockets\\Adapters", "socket/auto-connect": "Sockets\\AutoReconnects", + "socket/data-entity": "Sockets\\DataEntities", "network-monitor": "NetworkMonitors" }, "video": { diff --git a/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterBase.cs b/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterBase.cs index b4b7b971cc4..eaff156bfbc 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterBase.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/DataConverter/SocketDataConverterBase.cs @@ -28,7 +28,7 @@ public abstract class SocketDataConverterBase : ISocketDataConverter protected virtual bool Parse(ReadOnlyMemory data, TEntity entity) { - // 使用 SocketDataFieldAttribute 特性获取数据转换规则 + // 使用 SocketDataPropertyAttribute 特性获取数据转换规则 var ret = false; if (entity != null) { diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleBigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleBigEndianConverter.cs index 89a806c699a..2b4559d95a0 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleBigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleBigEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataDoubleBigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { double ret = 0; - Span paddedSpan = stackalloc byte[8]; - data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); - if (BinaryPrimitives.TryReadDoubleBigEndian(paddedSpan, out var v)) + if (data.Length <= 8) { - ret = v; + Span paddedSpan = stackalloc byte[8]; + data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); + if (BinaryPrimitives.TryReadDoubleBigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleLittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleLittleEndianConverter.cs index fd2f36cd2ee..06c6b27ee9d 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleLittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataDoubleLittleEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataDoubleLittleEndianConverter : ISocketDataPropertyConverte public object? Convert(ReadOnlyMemory data) { double ret = 0; - Span paddedSpan = stackalloc byte[8]; - data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); - if (BinaryPrimitives.TryReadDoubleLittleEndian(paddedSpan, out var v)) + if (data.Length <= 8) { - ret = v; + Span paddedSpan = stackalloc byte[8]; + data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); + if (BinaryPrimitives.TryReadDoubleLittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16BigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16BigEndianConverter.cs index ca3d50fd112..94fcfeb8bab 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16BigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16BigEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataInt16BigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { short ret = 0; - Span paddedSpan = stackalloc byte[2]; - data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); - if (BinaryPrimitives.TryReadInt16BigEndian(paddedSpan, out var v)) + if (data.Length <= 2) { - ret = v; + Span paddedSpan = stackalloc byte[2]; + data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); + if (BinaryPrimitives.TryReadInt16BigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16LittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16LittleEndianConverter.cs index 11025eabe63..41862b54203 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16LittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt16LittleEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataInt16LittleEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { short ret = 0; - Span paddedSpan = stackalloc byte[2]; - data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); - if (BinaryPrimitives.TryReadInt16LittleEndian(paddedSpan, out var v)) + if (data.Length <= 2) { - ret = v; + Span paddedSpan = stackalloc byte[2]; + data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); + if (BinaryPrimitives.TryReadInt16LittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32BigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32BigEndianConverter.cs index 3d02f4cbd33..2f76f168de4 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32BigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32BigEndianConverter.cs @@ -19,12 +19,15 @@ public class SocketDataInt32BigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { var ret = 0; - Span paddedSpan = stackalloc byte[4]; - data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); - - if (BinaryPrimitives.TryReadInt32BigEndian(paddedSpan, out var v)) + if (data.Length <= 4) { - ret = v; + Span paddedSpan = stackalloc byte[4]; + data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); + + if (BinaryPrimitives.TryReadInt32BigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32LittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32LittleEndianConverter.cs index 7e0be3f5d1d..d833da17183 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32LittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt32LittleEndianConverter.cs @@ -19,12 +19,15 @@ public class SocketDataInt32LittleEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { var ret = 0; - Span paddedSpan = stackalloc byte[4]; - data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); - - if (BinaryPrimitives.TryReadInt32LittleEndian(paddedSpan, out var v)) + if (data.Length <= 4) { - ret = v; + Span paddedSpan = stackalloc byte[4]; + data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); + + if (BinaryPrimitives.TryReadInt32LittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64BigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64BigEndianConverter.cs index 1c5ffb0fa48..5dc2d22f350 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64BigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64BigEndianConverter.cs @@ -19,12 +19,15 @@ public class SocketDataInt64BigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { long ret = 0; - Span paddedSpan = stackalloc byte[8]; - data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); - - if (BinaryPrimitives.TryReadInt64BigEndian(paddedSpan, out var v)) + if (data.Length <= 8) { - ret = v; + Span paddedSpan = stackalloc byte[8]; + data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); + + if (BinaryPrimitives.TryReadInt64BigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64LittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64LittleEndianConverter.cs index 91e920d23cd..dabbda71b7e 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64LittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataInt64LittleEndianConverter.cs @@ -19,12 +19,15 @@ public class SocketDataInt64LittleEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { long ret = 0; - Span paddedSpan = stackalloc byte[8]; - data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); - - if (BinaryPrimitives.TryReadInt64LittleEndian(paddedSpan, out var v)) + if (data.Length <= 8) { - ret = v; + Span paddedSpan = stackalloc byte[8]; + data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); + + if (BinaryPrimitives.TryReadInt64LittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleBigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleBigEndianConverter.cs index 233040aa894..14753c8a50a 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleBigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleBigEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataSingleBigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { float ret = 0; - Span paddedSpan = stackalloc byte[4]; - data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); - if (BinaryPrimitives.TryReadSingleBigEndian(paddedSpan, out var v)) + if (data.Length <= 4) { - ret = v; + Span paddedSpan = stackalloc byte[4]; + data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); + if (BinaryPrimitives.TryReadSingleBigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleLittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleLittleEndianConverter.cs index 7858af38904..0c3132aa406 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleLittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataSingleLittleEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataSingleLittleEndianConverter : ISocketDataPropertyConverte public object? Convert(ReadOnlyMemory data) { float ret = 0; - Span paddedSpan = stackalloc byte[4]; - data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); - if (BinaryPrimitives.TryReadSingleLittleEndian(paddedSpan, out var v)) + if (data.Length <= 4) { - ret = v; + Span paddedSpan = stackalloc byte[4]; + data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); + if (BinaryPrimitives.TryReadSingleLittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16BigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16BigEndianConverter.cs index cf5c7c793c7..96aba7ceaf8 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16BigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16BigEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataUInt16BigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { ushort ret = 0; - Span paddedSpan = stackalloc byte[2]; - data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); - if (BinaryPrimitives.TryReadUInt16BigEndian(paddedSpan, out var v)) + if (data.Length <= 2) { - ret = v; + Span paddedSpan = stackalloc byte[2]; + data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); + if (BinaryPrimitives.TryReadUInt16BigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16LittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16LittleEndianConverter.cs index 288e83db658..4abd0b76cf1 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16LittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt16LittleEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataUInt16LittleEndianConverter : ISocketDataPropertyConverte public object? Convert(ReadOnlyMemory data) { ushort ret = 0; - Span paddedSpan = stackalloc byte[2]; - data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); - if (BinaryPrimitives.TryReadUInt16LittleEndian(paddedSpan, out var v)) + if (data.Length <= 2) { - ret = v; + Span paddedSpan = stackalloc byte[2]; + data.Span.CopyTo(paddedSpan[(2 - data.Length)..]); + if (BinaryPrimitives.TryReadUInt16LittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32BigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32BigEndianConverter.cs index c731501fad6..eb26d1b5051 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32BigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32BigEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataUInt32BigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { uint ret = 0; - Span paddedSpan = stackalloc byte[4]; - data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); - if (BinaryPrimitives.TryReadUInt32BigEndian(paddedSpan, out var v)) + if (data.Length <= 4) { - ret = v; + Span paddedSpan = stackalloc byte[4]; + data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); + if (BinaryPrimitives.TryReadUInt32BigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32LittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32LittleEndianConverter.cs index 509edb7a02b..727f339ed6f 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32LittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt32LittleEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataUInt32LittleEndianConverter : ISocketDataPropertyConverte public object? Convert(ReadOnlyMemory data) { uint ret = 0; - Span paddedSpan = stackalloc byte[4]; - data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); - if (BinaryPrimitives.TryReadUInt32LittleEndian(paddedSpan, out var v)) + if (data.Length <= 4) { - ret = v; + Span paddedSpan = stackalloc byte[4]; + data.Span.CopyTo(paddedSpan[(4 - data.Length)..]); + if (BinaryPrimitives.TryReadUInt32LittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64BigEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64BigEndianConverter.cs index 1003b1d3d19..5e3d6ef9d94 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64BigEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64BigEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataUInt64BigEndianConverter : ISocketDataPropertyConverter public object? Convert(ReadOnlyMemory data) { ulong ret = 0; - Span paddedSpan = stackalloc byte[8]; - data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); - if (BinaryPrimitives.TryReadUInt64BigEndian(paddedSpan, out var v)) + if (data.Length <= 8) { - ret = v; + Span paddedSpan = stackalloc byte[8]; + data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); + if (BinaryPrimitives.TryReadUInt64BigEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; } diff --git a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64LittleEndianConverter.cs b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64LittleEndianConverter.cs index 533f4c35ef1..ee976251e97 100644 --- a/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64LittleEndianConverter.cs +++ b/src/BootstrapBlazor/Services/TcpSocket/PropertyConverter/SocketDataUInt64LittleEndianConverter.cs @@ -19,11 +19,14 @@ public class SocketDataUInt64LittleEndianConverter : ISocketDataPropertyConverte public object? Convert(ReadOnlyMemory data) { ulong ret = 0; - Span paddedSpan = stackalloc byte[8]; - data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); - if (BinaryPrimitives.TryReadUInt64LittleEndian(paddedSpan, out var v)) + if (data.Length <= 8) { - ret = v; + Span paddedSpan = stackalloc byte[8]; + data.Span.CopyTo(paddedSpan[(8 - data.Length)..]); + if (BinaryPrimitives.TryReadUInt64LittleEndian(paddedSpan, out var v)) + { + ret = v; + } } return ret; }