This commit is contained in:
2248356998 qq.com
2025-08-21 22:40:53 +08:00
parent fe78a4c3ca
commit 46c1780017
3 changed files with 48 additions and 44 deletions

View File

@@ -1,9 +1,9 @@
<Project>
<PropertyGroup>
<PluginVersion>10.11.5</PluginVersion>
<ProPluginVersion>10.11.5</ProPluginVersion>
<DefaultVersion>10.11.5</DefaultVersion>
<PluginVersion>10.11.6</PluginVersion>
<ProPluginVersion>10.11.6</ProPluginVersion>
<DefaultVersion>10.11.6</DefaultVersion>
<AuthenticationVersion>10.11.2</AuthenticationVersion>
<SourceGeneratorVersion>10.11.2</SourceGeneratorVersion>
<NET8Version>8.0.19</NET8Version>

View File

@@ -385,39 +385,27 @@ public static class ByteBlockExtension
}
public static void WriteBackValue<TWriter, T>(ref TWriter writer, T value, EndianType endianType, int pos)
where T : unmanaged
where TWriter : IBytesWriter
where TWriter : IByteBlockWriter
{
if (writer.SupportsRewind)
{
var nowPos = (int)writer.WrittenCount - pos;
writer.Advance(-nowPos);
var size = Unsafe.SizeOf<T>();
var span = writer.GetSpan(size);
TouchSocketBitConverter.GetBitConverter(endianType).WriteBytes(span, value);
writer.Advance(nowPos);
}
else
{
throw new InvalidOperationException("Writer version mismatch or does not support rewind.");
}
var nowPos = (int)writer.WrittenCount - pos;
writer.Advance(-nowPos);
var size = Unsafe.SizeOf<T>();
var span = writer.GetSpan(size);
TouchSocketBitConverter.GetBitConverter(endianType).WriteBytes(span, value);
writer.Advance(nowPos);
}
public static void WriteBackValue<TWriter, T>(ref TWriter writer, T value, EndianType endianType, long pos)
where T : unmanaged
where TWriter : IBytesWriter
where TWriter : IByteBlockWriter
{
if (writer.SupportsRewind)
{
var nowPos = (int)(writer.WrittenCount - pos);
writer.Advance(-nowPos);
var size = Unsafe.SizeOf<T>();
var span = writer.GetSpan(size);
TouchSocketBitConverter.GetBitConverter(endianType).WriteBytes(span, value);
writer.Advance(nowPos);
}
else
{
throw new InvalidOperationException("Writer version mismatch or does not support rewind.");
}
var nowPos = (int)(writer.WrittenCount - pos);
writer.Advance(-nowPos);
var size = Unsafe.SizeOf<T>();
var span = writer.GetSpan(size);
TouchSocketBitConverter.GetBitConverter(endianType).WriteBytes(span, value);
writer.Advance(nowPos);
}
public static string ReadNormalString<TReader>(ref TReader reader, int length)
@@ -429,20 +417,32 @@ where TWriter : IBytesWriter
return str;
}
public static void WriteBackNormalString<TWriter>(ref TWriter writer, string value, Encoding encoding, int pos)
where TWriter : IBytesWriter
where TWriter : IByteBlockWriter
{
if (writer.SupportsRewind)
var nowPos = (int)(writer.WrittenCount - pos);
writer.Advance(-nowPos);
WriterExtension.WriteNormalString(ref writer, value, encoding);
writer.Advance(nowPos);
}
public static int WriteNormalString(this Span<byte> span, string value, Encoding encoding)
{
var maxSize = encoding.GetMaxByteCount(value.Length);
var chars = value.AsSpan();
unsafe
{
var nowPos = (int)(writer.WrittenCount - pos);
writer.Advance(-nowPos);
WriterExtension.WriteNormalString(ref writer, value, encoding);
writer.Advance(nowPos);
}
else
{
throw new InvalidOperationException("Writer version mismatch or does not support rewind.");
fixed (char* p = &chars[0])
{
fixed (byte* p1 = &span[0])
{
var len = Encoding.UTF8.GetBytes(p, chars.Length, p1, maxSize);
return len;
}
}
}
}

View File

@@ -144,6 +144,7 @@ public class S7Send : ISendMessage
internal void GetWriteByteCommand<TByteBlock>(ref TByteBlock byteBlock, SiemensS7Address[] addresss) where TByteBlock : IBytesWriter
{
var span = byteBlock.GetSpan(1024);
byte itemLen = (byte)addresss.Length;
ushort parameterLen = (ushort)(itemLen * 12 + 2);
//TPKT
@@ -201,7 +202,10 @@ public class S7Send : ISendMessage
}
ushort telegramLen = (ushort)(itemLen * 12 + 19 + dataLen);
ByteBlockExtension.WriteBackValue(ref byteBlock, (ushort)telegramLen, EndianType.Big, 2);//长度
ByteBlockExtension.WriteBackValue(ref byteBlock, (ushort)dataLen, EndianType.Big, 15);//长度
TouchSocketBitConverter.GetBitConverter(EndianType.Big).WriteBytes(span.Slice(2), (ushort)telegramLen);
//ByteBlockExtension.WriteBackValue(ref byteBlock, (ushort)telegramLen, EndianType.Big, 2);//长度
TouchSocketBitConverter.GetBitConverter(EndianType.Big).WriteBytes(span.Slice(15), (ushort)dataLen);
//ByteBlockExtension.WriteBackValue(ref byteBlock, (ushort)dataLen, EndianType.Big, 15);//长度
}
}