public SpanBuffer <byte> ToPacketBinary()
    {
        WpcItemList list = new WpcItemList();

        var packData = this.Pack.WriteToBuf().ByteData;

        list.Add("PACK", packData);

        var hashData = Secure.HashSHA1(packData);

        list.Add("HASH", hashData);

        if (this.HostKey._IsFilled() && this.HostSecret2._IsFilled())
        {
            var hostKeyData     = this.HostKey._GetHexBytes();
            var hostSecret2Data = this.HostSecret2._GetHexBytes();

            if (hostKeyData.Length != 20)
            {
                throw new CoresLibException("hostKeyData.Length != 20");
            }

            if (hostSecret2Data.Length != 20)
            {
                throw new CoresLibException("hostSecret2Data.Length != 20");
            }

            list.Add("HOST", hostKeyData);
            list.Add("HOST", hostSecret2Data);
        }

        return(list.ToPacketBinary());
    }
    public static WpcItemList Parse(ref ReadOnlySpanBuffer <byte> buf)
    {
        WpcItemList ret = new WpcItemList();

        while (true)
        {
            if (WpcItem.Parse(ref buf, out string name, out ReadOnlyMemory <byte> data) == false)
            {
                break;
            }

            ret.Add(name, data);
        }

        return(ret);
    }
    public static WpcPack Parse(string recvStr, bool requireKeyAndSecret)
    {
        WpcItemList items           = WpcItemList.Parse(recvStr);
        var         packItem        = items.Find("PACK");
        var         hashItem        = items.Find("HASH");
        var         hostKeyItem     = items.Find("HOST", 0);
        var         hostSecret2Item = items.Find("HOST", 1);

        if (packItem == null || hashItem == null)
        {
            throw new CoresLibException("packItem == null || hashItem == null");
        }

        var hash = Secure.HashSHA1(packItem.Data.Span).AsSpan();

        if (hash._MemEquals(hashItem.Data.Span) == false)
        {
            throw new CoresLibException("Different hash");
        }

        Buf buf = new Buf(packItem.Data.ToArray());

        var pack = Pack.CreateFromBuf(buf);

        string hostKey     = "";
        string hostSecret2 = "";

        if (requireKeyAndSecret)
        {
            if (hostKeyItem == null || hostKeyItem.Data.Length != 20)
            {
                throw new CoresLibException("hostKeyItem == null || hostKeyItem.Data.Length != 20");
            }

            if (hostSecret2Item == null || hostSecret2Item.Data.Length != 20)
            {
                throw new CoresLibException("hostSecret2Item == null || hostSecret2Item.Data.Length != 20");
            }
        }

        hostKey     = hostKeyItem?.Data._GetHexString() ?? "";
        hostSecret2 = hostSecret2Item?.Data._GetHexString() ?? "";

        return(new WpcPack(pack, hostKey, hostSecret2));
    }