public byte[] GetDestination(byte[] store, int dataLength) { byte[] ret = null; if (IsMulticast) { ListReference lref = (ListReference)Destination.Item; int len = (store[lref.IndexOfSize.IndexInData] & lref.IndexOfSize.MaskInData) >> lref.IndexOfSize.OffsetInData; if (len > 0 && dataLength > len + lref.Index.IndexInData) { IList <byte> tmp = new List <byte>(); byte nodeIdx = 0; for (int i = 0; i < len; i++) { byte availabilityMask = store[lref.Index.IndexInData + i]; for (byte bit = 0; bit < 8; bit++) { nodeIdx++; if ((availabilityMask & (1 << bit)) > 0) { tmp.Add(nodeIdx); } } } if (tmp.Count > 0) { ret = tmp.ToArray(); } } } else { ItemReference iref = (ItemReference)Destination.Item; ret = new byte[1]; ret[0] = store[iref.Index.IndexInData]; } return(ret); }
private static byte GetLength(byte[] store, Param param) { int ret = 0; if (param.ItemRef != null) { ItemReference iref = param.ItemRef; if (iref.IndexOfOpt == null || iref.IndexOfOpt != null && (store[iref.IndexOfOpt.IndexInData] & iref.IndexOfOpt.MaskInData) >> iref.IndexOfOpt.OffsetInData > 0) { int bCount = param.Bits / 8 * (param.Size > 0 ? param.Size : 1); if (bCount >= 0) { ret += iref.Index.IndexInData + bCount; } } else { ret += iref.Index.IndexInData; } } else { ListReference lref = param.ListRef; if (lref.IndexOfOpt == null || lref.IndexOfOpt != null && (store[lref.IndexOfOpt.IndexInData] & lref.IndexOfOpt.MaskInData) >> lref.IndexOfOpt.OffsetInData > 0) { if (param.PreviousVariableParam != null) { byte prevLen = (byte)(GetLength(store, param.PreviousVariableParam) + lref.Index.IndexInData); if (store.Length > prevLen - 1 + lref.IndexOfSize.IndexInData) { int len = (store[prevLen - 1 + lref.IndexOfSize.IndexInData] & lref.IndexOfSize.MaskInData) >> lref.IndexOfSize.OffsetInData; if (len >= 0) { int bCount = param.Bits / 8 * len + (param.SizeCorrectionSpecified ? param.SizeCorrection : 0); if (bCount >= 0) { ret += lref.Index.IndexInData + bCount; } } } } else { if (store.Length > lref.IndexOfSize.IndexInData) { int len = (store[lref.IndexOfSize.IndexInData] & lref.IndexOfSize.MaskInData) >> lref.IndexOfSize.OffsetInData; if (len >= 0) { int bCount = param.Bits / 8 * len + (param.SizeCorrectionSpecified ? param.SizeCorrection : 0); if (bCount >= 0) { ret += lref.Index.IndexInData + bCount; } } } } } else { ret += lref.Index.IndexInData; } } if (param.PreviousVariableParam != null) { ret += GetLength(store, param.PreviousVariableParam); } if (ret < 0 || ret > 0xFF) { ret = 0; } return((byte)ret); }