public static RealtimeStatus Deserialize(byte[] bytes) { if (bytes == null || bytes.Length < statusSize) { return(null); } byte[] b1 = bytes.Take(statusSize).ToArray(); RealtimeStatusWithoutSwitches status = BigEndianStructHelper <RealtimeStatusWithoutSwitches> .BytesToStruct(b1, MsgConsts.MsgEncoding); if (status.NoSwitch > 0 && status.NoSwitch * switchSize + switchSize <= bytes.Length) { SecuritySwitch[] switches = new SecuritySwitch[status.NoSwitch]; for (int i = 0; i < status.NoSwitch; i++) { int offset = statusSize + switchSize * i; byte[] b2 = bytes.Skip(offset).Take(switchSize).ToArray(); SecuritySwitch s = BigEndianStructHelper <SecuritySwitch> .BytesToStruct(b2, MsgConsts.MsgEncoding); switches[i] = s; } RealtimeStatus rtn = new RealtimeStatus() { Status = status, Switches = switches }; return(rtn); } else { return(null); } }
/// <summary> /// 处理行情数据 /// </summary> /// <param name="msg"></param> /// TODO:考虑把收到的数据包加入队列异步处理 private void ProcessMessage(MessagePack msg) { DateTime now = DateTime.Now; IMarketData marketData = null; if (msg.Header.Type == (uint)MsgType.ChannelHeartbeat) { ChannelHeartbeat heartbeat = ChannelHeartbeat.Deserialize(msg.BodyData); logMarketData <ChannelHeartbeat>(heartbeat); } else if (msg.Header.Type == (uint)MsgType.RealtimeStatus) { marketData = RealtimeStatus.Deserialize(msg.BodyData); logMarketData <RealtimeStatus>(marketData as RealtimeStatus); } else if (msg.Header.Type == (uint)MsgType.QuotationSnap) { marketData = QuotSnap300111.Deserialize(msg.BodyData); logMarketData <QuotSnap300111>(marketData as QuotSnap300111); } else if (msg.Header.Type == (uint)MsgType.IndexQuotationSnap) { marketData = QuotSnap309011.Deserialize(msg.BodyData); logMarketData <QuotSnap309011>(marketData as QuotSnap309011); } else if (msg.Header.Type == (uint)MsgType.Order) { marketData = Order300192.Deserialize(msg.BodyData); logMarketData <Order300192>((Order300192)marketData); } if (marketData != null) { logMarketData(marketData); RaiseEvent(marketData, now); } if (this.msgPackRecorder != null) { this.msgPackRecorder.Record(new MessagePackEx(msg, now)); } }
public static RealtimeStatus Deserialize(byte[] bytes) { if (bytes == null || bytes.Length < statusSize) return null; byte[] b1 = bytes.Take(statusSize).ToArray(); RealtimeStatusWithoutSwitches status = BigEndianStructHelper<RealtimeStatusWithoutSwitches>.BytesToStruct(b1, MsgConsts.MsgEncoding); if (status.NoSwitch > 0 && status.NoSwitch * switchSize + switchSize <= bytes.Length) { SecuritySwitch[] switches = new SecuritySwitch[status.NoSwitch]; for (int i = 0; i < status.NoSwitch; i++) { int offset = statusSize + switchSize * i; byte[] b2 = bytes.Skip(offset).Take(switchSize).ToArray(); SecuritySwitch s = BigEndianStructHelper<SecuritySwitch>.BytesToStruct(b2, MsgConsts.MsgEncoding); switches[i] = s; } RealtimeStatus rtn = new RealtimeStatus() { Status = status, Switches = switches }; return rtn; } else { return null; } }