优化IPacket的TryGetArray和ToHex,减少内存分配和装箱操作
石头 authored at 2024-09-22 00:53:17
1.71 KiB
X
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NewLife;
using Xunit;

namespace XUnitTest.Buffers;

public class SpanHelperTests
{
    [Fact]
    public void ToStr()
    {
        var str = "Hello NewLife";
        var buf = Encoding.UTF8.GetBytes(str);

        var span = new Span<Byte>(buf);
        var str2 = span.ToStr();
        Assert.Equal(str, str2);

        var span3 = new ReadOnlySpan<Byte>(buf);
        var str3 = span3.ToStr();
        Assert.Equal(str, str3);
    }

    [Fact]
    public void GetBytes()
    {
        var str = "Hello NewLife";
        var buf = Encoding.UTF8.GetBytes(str);

        Span<Byte> span = stackalloc Byte[buf.Length];
        var count = Encoding.UTF8.GetBytes(str.AsSpan(), span);
        Assert.Equal(str.Length, count);
        Assert.Equal('H', (Char)span[0]);
        Assert.Equal('e', (Char)span[1]);
        Assert.Equal('l', (Char)span[2]);
        Assert.Equal('l', (Char)span[3]);
        Assert.Equal('o', (Char)span[4]);

        var str3 = Encoding.UTF8.GetString(span);
        Assert.Equal(str, str3);
    }

    [Fact]
    public void ToHex()
    {
        var str = "Hello NewLife";
        var buf = Encoding.UTF8.GetBytes(str);

        Span<Byte> span = stackalloc Byte[buf.Length];
        var count = Encoding.UTF8.GetBytes(str.AsSpan(), span);

        Assert.Equal(buf.ToHex(), span.ToHex());
        Assert.Equal(buf.ToHex(null, 0, 8), span.ToHex(null, 0, 8));
        Assert.Equal(buf.ToHex("-", 0, 8), span.ToHex("-", 0, 8));
        Assert.Equal(buf.ToHex("+&", 5, 8), span.ToHex("+&", 5, 8));

        ReadOnlySpan<Byte> span2 = span;
        Assert.Equal(buf.ToHex(), span2.ToHex());
    }
}