/// <summary> /// Adds message bytes the rest of the Fields /// </summary> /// <param name="orderedFieldPositions">fields that need to be builded</param> /// <param name="message">message instance</param> /// <param name="messageBytes">message bytes as Ref</param> private void BuildFields(IEnumerable <int> orderedFieldPositions, IIsoMessage message, ref List <byte> messageBytes) { foreach (var fieldPosition in orderedFieldPositions) { IIsoFieldProperties fieldProperties = message.GetFieldByPosition(fieldPosition); if (fieldProperties != null) { var valueForMessage = fieldProperties.Value; _validator?.EnsureContent(fieldProperties); _validator?.EnsureLength(fieldProperties); if (fieldProperties is IsoField isoField && isoField.Tags != null) { IEnumerable <byte> customFieldBytes = BuildTagFields(isoField); messageBytes.AddRange(fieldProperties.BuildCustomFieldLentgh(customFieldBytes.Count().ToString())); messageBytes.AddRange(customFieldBytes); } else { messageBytes.AddRange(fieldProperties.BuildFieldValue(valueForMessage.ToString())); } } }
/// <summary> /// Parse Iso Message bytes to IIsoMessage object /// </summary> /// <param name="isoMessageBytes">bytes to parse</param> /// <param name="isoMessage">iso message object</param> /// <returns>an IISOMessage object</returns> public IIsoMessage Parse(byte[] isoMessageBytes, IIsoMessage isoMessage) { var currentPosition = 0; isoMessage.MTI.Value = isoMessage.MTI.GetFieldValue(isoMessageBytes, ref currentPosition); isoMessage.BitMap.Value = ParseBitMap(isoMessage.BitMap, isoMessageBytes, ref currentPosition); ParseFields(ref isoMessage, isoMessageBytes, currentPosition); //Keep Only Fields with values, isoMessage.IsoFieldsCollection = isoMessage.IsoFieldsCollection.Where(p => p.Value != null).ToList(); return(isoMessage); }
/// <summary> /// Build byte from IIsoMessage /// </summary> /// <param name="message">IIsoMessage instance</param> /// <returns>byte array of builded message</returns> public byte[] Build(IIsoMessage message) { //Get Only Fields that Have values or Tags Defined with values IEnumerable <int> orderedFieldPositions = message.IsoFieldsCollection .Where(c => c.Value != null || (c.Tags?.Count > 0 && c.Tags.Any(tag => tag.Value != null))).Select(c => (int)c.Position); var mtiBytes = message.MTI.BuildFieldValue(message.MTI.Value); var messageBytes = new List <byte>(mtiBytes); messageBytes.AddRange(BuildBitMap(message.BitMap, orderedFieldPositions)); IEnumerable <int> fieldsToBuild = orderedFieldPositions.Where(pos => pos != (int)IsoFields.F1 && pos != (int)IsoFields.BitMap && pos != (int)IsoFields.MTI); BuildFields(fieldsToBuild, message, ref messageBytes); return(messageBytes.ToArray()); }