/// <summary>
        /// Read RFID tag data using RSM
        /// </summary>
        /// <param name="tagID">The EPC Tag ID of the tag to be operated upon. (size-encoded binary)</param>
        /// <param name="rfidBank">Desired Tag Bank</param>
        /// <param name="offset">Word offset into tag buffer </param>
        /// <param name="length">Words of data to read from tag buffer. 0 means entire bank</param>
        /// <param name="password">Optional access password</param>
        /// <param name="rfidData">Buffer for read, write, and lock (size-encoded binary)</param>
        /// <returns>Status of the command</returns>
        private int ReadTag(string tagID, RfidBank rfidBank, int offset, int length, string password, out string rfidData)
        {
            int rfidCommandStatus = -1;

            if (String.IsNullOrEmpty(tagID) || length < 0)
            {
                throw new ArgumentException(INCORRECT_ARGUMENT);
            }
            rfidData = string.Empty;

            string attributesXml = RFID_READ_XML_TEMPLATE;

            attributesXml = attributesXml.Replace("TAGID", GetHexDataArrayWithHexLengthPrefix(tagID));
            attributesXml = attributesXml.Replace("BANK", ((int)rfidBank).ToString());
            attributesXml = attributesXml.Replace("OFFSET", offset.ToString());
            attributesXml = attributesXml.Replace("LENGTH", length.ToString());
            attributesXml = attributesXml.Replace("COMMAND", ((int)RfidCommand.Read).ToString());

            SetAttributes(attributesXml);

            rfidCommandStatus = GetRfidCommandStatus();
            if (rfidCommandStatus == STATUS_SUCCESS)
            {
                rfidData = GetRfidData();
            }
            return(rfidCommandStatus);
        }
        /// <summary>
        /// Write RFID tag data using RSM
        /// </summary>
        /// <param name="tagID">EPC code of desired tag</param>
        /// <param name="rfidBank">Desired memory bank of tag</param>
        /// <param name="rfidData">Data to write</param>
        /// <param name="offset">Word offset into the memory bank</param>
        /// <param name="password">Optional access password</param>
        /// <returns>Status of the last RFID operation</returns>
        private int WriteTag(string tagID, RfidBank rfidBank, string rfidData, int offset, string password)
        {
            if (String.IsNullOrEmpty(tagID) || String.IsNullOrEmpty(rfidData))
            {
                throw new ArgumentException(INCORRECT_ARGUMENT);
            }

            string attributesXml = RFID_WRITE_XML_TEMPLATE;

            attributesXml = attributesXml.Replace("TAGID", GetHexDataArrayWithHexLengthPrefix(tagID));
            attributesXml = attributesXml.Replace("BANK", ((int)rfidBank).ToString());
            attributesXml = attributesXml.Replace("DATA", GetHexDataArrayWithHexLengthPrefix(rfidData));
            attributesXml = attributesXml.Replace("OFFSET", offset.ToString());
            attributesXml = attributesXml.Replace("COMMAND", ((int)RfidCommand.Write).ToString());

            SetAttributes(attributesXml);

            return(GetRfidCommandStatus());
        }