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 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 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); } /// /// 数字编码 大端模式、高位在前 /// /// /// 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; } } }