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); }
/// <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; }
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); } }
/// <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); } }
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 } }
private static byte[] Pack(DanmuType action, string payload) { return(Pack(action, payload == null ? null : Encoding.UTF8.GetBytes(payload))); }