Пример #1
0
        private static byte[] Pack(DanmuType action, byte[] payload)
        {
            byte[] packet;

            if (payload == null)
            {
                payload = Array.Empty <byte>();
            }
            packet = new byte[payload.Length + 16];
            using (MemoryStream stream = new MemoryStream(packet)) {
                stream.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(packet.Length)), 0, 4);
                // packet length
                stream.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)16)), 0, 2);
                // header length
                stream.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)1)), 0, 2);
                // version
                stream.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((int)action)), 0, 4);
                // action
                stream.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(1)), 0, 4);
                // magic
                if (payload.Length > 0)
                {
                    stream.Write(payload, 0, payload.Length);
                }
                // payload
            }
            return(packet);
        }
Пример #2
0
        /// <summary>
        /// 构造器
        /// </summary>
        /// <param name="type"></param>
        /// <param name="data"></param>
        public Danmu(DanmuType type, byte[] data)
        {
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            _type = type;
            _data = data;
        }
Пример #3
0
        private static Danmu ResolveDanmuPayload(DanmuType action, byte[] payload)
        {
            switch (action)
            {
            case DanmuType.Command:
            case DanmuType.Handshaking:
                return(new Danmu(action, payload));

            default:
                return(Danmu.Empty);
            }
        }
Пример #4
0
        /// <summary>
        /// 解析弹幕
        /// </summary>
        /// <param name="action"></param>
        /// <param name="payload">原始的二进制格式弹幕</param>
        /// <returns></returns>
        public static Danmu ResolveDanmu(DanmuType action, byte[] payload)
        {
            if (payload == null)
            {
                throw new ArgumentNullException(nameof(payload));
            }

            switch (action)
            {
            case DanmuType.Command:
            case DanmuType.Handshaking:
                return(new Danmu(action, payload));

            default:
                return(Danmu.Empty);
            }
        }
Пример #5
0
        private static unsafe void ResolveDanmuHeader(byte[] header, out int length, out DanmuType action)
        {
            fixed(byte *p = header)
            {
                int value;

                value = IPAddress.NetworkToHostOrder(*(int *)p);
                // packet length
                length = value - 16;
#pragma warning disable IDE0059
                value = IPAddress.NetworkToHostOrder(*(short *)(p + 4));
                // header length
                value = IPAddress.NetworkToHostOrder(*(short *)(p + 6));
                // version
                value = IPAddress.NetworkToHostOrder(*(int *)(p + 8));
                // action
                action = (DanmuType)value;
                value  = IPAddress.NetworkToHostOrder(*(int *)(p + 12));
                // magic
#pragma warning restore IDE0059
            }
        }
Пример #6
0
 private static byte[] Pack(DanmuType action, string payload)
 {
     return(Pack(action, payload == null ? null : Encoding.UTF8.GetBytes(payload)));
 }