|
- using JTActiveSafety.Protocol.Buffers;
- using System;
- using System.Buffers;
- using System.Buffers.Binary;
- using System.Text;
-
- namespace JTActiveSafety.Protocol.MessagePack
- {
- ref struct JTActiveSafetyMessagePackWriter
- {
- private JTActiveSafetyBufferWriter writer;
- public JTActiveSafetyMessagePackWriter(Span<byte> buffer)
- {
- this.writer = new JTActiveSafetyBufferWriter(buffer);
- }
- public byte[] FlushAndGetArray()
- {
- return writer.Written.ToArray();
- }
- public void WriteByte(byte value)
- {
- var span = writer.Free;
- span[0] = value;
- writer.Advance(1);
- }
- public void WriteUInt16(ushort value)
- {
- BinaryPrimitives.WriteUInt16BigEndian(writer.Free, value);
- writer.Advance(2);
- }
- public void WriteInt32(int value)
- {
- BinaryPrimitives.WriteInt32BigEndian(writer.Free, value);
- writer.Advance(4);
- }
- public void WriteUInt64(ulong value)
- {
- BinaryPrimitives.WriteUInt64BigEndian(writer.Free, value);
- writer.Advance(8);
- }
- public void WriteUInt32(uint value)
- {
- BinaryPrimitives.WriteUInt32BigEndian(writer.Free, value);
- writer.Advance(4);
- }
- public void WriteString(string value)
- {
- byte[] codeBytes = Encoding.UTF8.GetBytes(value);
- codeBytes.CopyTo(writer.Free);
- writer.Advance(codeBytes.Length);
- }
- public void WriteArray(ReadOnlySpan<byte> src)
- {
- src.CopyTo(writer.Free);
- writer.Advance(src.Length);
- }
- public void WriteBCD(string value, int len)
- {
- string bcdText = value ?? "";
- int startIndex = 0;
- int noOfZero = len - bcdText.Length;
- if (noOfZero > 0)
- {
- bcdText = bcdText.Insert(startIndex, new string('0', noOfZero));
- }
- int byteIndex = 0;
- int count = len / 2;
- var bcdSpan = bcdText.AsSpan();
- var spanFree = writer.Free;
- while (startIndex < bcdText.Length && byteIndex < count)
- {
- spanFree[byteIndex++] = Convert.ToByte(bcdSpan.Slice(startIndex, 2).ToString(), 16);
- startIndex += 2;
- }
- writer.Advance(byteIndex);
- }
- /// <summary>
- /// 数字编码 大端模式、高位在前
- /// </summary>
- /// <param name="value"></param>
- /// <param name="len"></param>
- public void WriteBigNumber(string value, int len)
- {
- var spanFree = writer.Free;
- ulong number = string.IsNullOrEmpty(value) ? 0 : (ulong)double.Parse(value);
- for (int i = len - 1; i >= 0; i--)
- {
- spanFree[i] = (byte)(number & 0xFF); //取低8位
- number = number >> 8;
- }
- writer.Advance(len);
- }
- public int GetCurrentPosition()
- {
- return writer.WrittenCount;
- }
- }
- }
|