Encapsulates a since character value in an RSS barcode, including its checksum information.
        /// <summary>
        /// Determines whether the specified <see cref="System.Object"/> is equal to this instance.
        /// </summary>
        /// <param name="o">The <see cref="System.Object"/> to compare with this instance.</param>
        /// <returns>
        ///   <c>true</c> if the specified <see cref="System.Object"/> is equal to this instance; otherwise, <c>false</c>.
        /// </returns>
        override public bool Equals(Object o)
        {
            if (!(o is DataCharacter))
            {
                return(false);
            }
            DataCharacter that = (DataCharacter)o;

            return(Value == that.Value && ChecksumPortion == that.ChecksumPortion);
        }
        private Pair decodePair(BitArray row, bool right, int rowNumber, IDictionary <DecodeHintType, object> hints)
        {
            int[] startEnd = findFinderPattern(row, 0, right);
            if (startEnd == null)
            {
                return(null);
            }
            FinderPattern pattern = parseFoundFinderPattern(row, rowNumber, right, startEnd);

            if (pattern == null)
            {
                return(null);
            }

            ResultPointCallback resultPointCallback = hints == null || !hints.ContainsKey(DecodeHintType.NEED_RESULT_POINT_CALLBACK) ? null :
                                                      (ResultPointCallback)hints[DecodeHintType.NEED_RESULT_POINT_CALLBACK];

            if (resultPointCallback != null)
            {
                float center = (startEnd[0] + startEnd[1]) / 2.0f;
                if (right)
                {
                    // row is actually reversed
                    center = row.Size - 1 - center;
                }
                resultPointCallback(new ResultPoint(center, rowNumber));
            }

            DataCharacter outside = decodeDataCharacter(row, pattern, true);

            if (outside == null)
            {
                return(null);
            }
            DataCharacter inside = decodeDataCharacter(row, pattern, false);

            if (inside == null)
            {
                return(null);
            }
            return(new Pair(1597 * outside.Value + inside.Value,
                            outside.ChecksumPortion + 4 * inside.ChecksumPortion,
                            pattern));
        }