private bool isDataChangedAccordingToRule(byte[] bytes, MemoryRule rule, out IChangedDataContainer changedBytes) { ISet <long> changedBytesSet = new HashSet <long>(); var count = bytes.LongLength; var sendAll = rule.TransferType == TransferType.AllBytes; for (long i = 0; i < count; ++i) { if (rule.Bytes[i] != bytes[i]) { if (rule.ChangeTrigger == ChangeTrigger.AnyChange || rule.ChangeTrigger == ChangeTrigger.FlagOn && (rule.Bytes[i] | bytes[i]) != rule.Bytes[i] || rule.ChangeTrigger == ChangeTrigger.FlagOff && (rule.Bytes[i] & bytes[i]) != rule.Bytes[i] || rule.ChangeTrigger == ChangeTrigger.Increase && rule.NumBytes == 1 && bytes[i] > rule.Bytes[i] || rule.ChangeTrigger == ChangeTrigger.Decrease && rule.NumBytes == 1 && bytes[i] < rule.Bytes[i]) { changedBytesSet.Add(i); if (sendAll) { break; } } } } if (changedBytesSet.Count > 0) { if (sendAll) { changedBytes = new BytesContainer(bytes, rule.MemoryOffset64); } else { changedBytes = BytesDifferenceContainer.ChangedBytesFromIndexSet(rule.MemoryOffset64, changedBytesSet, bytes); } return(true); } else { changedBytes = null; return(false); } }
public static IChangedDataContainer BuildChangedData(byte[] buffer) { if (buffer.Length == 0) { throw new Exception("Empty buffer"); } if (buffer[0] > 2) { throw new Exception("Invalid ChangeDataType"); } var type = (ChangeDataType)buffer[0]; IChangedDataContainer container = null; if (type == ChangeDataType.Bytes) { container = new BytesContainer(new byte[0], 0); container.FillFromNetworkBytes(buffer); } if (type == ChangeDataType.BytesDifference) { container = new BytesDifferenceContainer(0); container.FillFromNetworkBytes(buffer); } if (type == ChangeDataType.NumberDifference) { container = new NumberDifferenceContainer(new byte[0], 0); container.FillFromNetworkBytes(buffer); } if (container == null) { throw new Exception("Unable to build change data from supplied buffer"); } return(container); }