Example #1
0
        public static VersionCheckStatus VersionCheck(int versionNum, int numDataBits, Mode mode, ErrorCorrectionLevel level, string encodingName)
        {
            int    TotalDataBits = numDataBits;
            ECISet eciSet        = new ECISet(ECISet.AppendOption.NameToValue);

            if (mode == Mode.EightBitByte)
            {
                if (encodingName != DEFAULT_ENCODING)
                {
                    int eciValue = eciSet.GetECIValueByName(encodingName);
                    TotalDataBits += ECISet.NumOfECIHeaderBits(eciValue);
                }
            }
            int bitCharCountIndicator = CharCountIndicatorTable.GetBitCountInCharCountIndicator(mode, versionNum);

            TotalDataBits += (4 + bitCharCountIndicator);

            int expectContainer = DataBits(versionNum, level);
            int lowerContainer  = versionNum == 1 ? 0 : DataBits(versionNum - 1, level);

            if (expectContainer < TotalDataBits)
            {
                return(VersionCheckStatus.SmallerThanExpect);
            }
            else if (lowerContainer >= TotalDataBits)
            {
                return(VersionCheckStatus.LargerThanExpect);
            }
            else
            {
                return(VersionCheckStatus.Efficient);
            }
        }
Example #2
0
        /// <summary>
        /// Determine which version to use
        /// </summary>
        /// <param name="dataBitsLength">Number of bits for encoded content</param>
        /// <param name="mode">The mode.</param>
        /// <param name="level">The level.</param>
        /// <param name="encodingName">Encoding name for EightBitByte</param>
        /// <returns>VersionDetail and ECI</returns>
        /// <remarks></remarks>
        internal static VersionControlStruct InitialSetup(int dataBitsLength, Mode mode, ErrorCorrectionLevel level,
                                                          string encodingName)
        {
            int totalDataBits = dataBitsLength;

            bool containECI = false;

            var eciHeader = new BitList();


            //Check ECI header
            if (mode == Mode.EightBitByte)
            {
                if (encodingName != DEFAULT_ENCODING && encodingName != QRCodeConstantVariable.UTF8Encoding)
                {
                    var eciSet   = new ECISet(ECISet.AppendOption.NameToValue);
                    int eciValue = eciSet.GetECIValueByName(encodingName);

                    totalDataBits += ECISet.NumOfECIHeaderBits(eciValue);
                    eciHeader      = eciSet.GetECIHeader(encodingName);
                    containECI     = true;
                }
            }
            //Determine which version group it belong to
            int searchGroup = DynamicSearchIndicator(totalDataBits, level, mode);

            int[] charCountIndicator = CharCountIndicatorTable.GetCharCountIndicatorSet(mode);

            totalDataBits += (NUM_BITS_MODE_INDICATOR + charCountIndicator[searchGroup]);

            int lowerSearchBoundary  = searchGroup == 0 ? 1 : (VERSION_GROUP[searchGroup - 1] + 1);
            int higherSearchBoundary = VERSION_GROUP[searchGroup];

            //Binary search to find proper version
            int versionNum = BinarySearch(totalDataBits, level, lowerSearchBoundary, higherSearchBoundary);

            VersionControlStruct vcStruct = FillVCStruct(versionNum, level, encodingName);

            vcStruct.isContainECI = containECI;

            vcStruct.ECIHeader = eciHeader;

            return(vcStruct);
        }
Example #3
0
        /// <summary>
        /// Determine which version to use
        /// </summary>
        /// <param name="dataBitsLength">Number of bits for encoded content</param>
        /// <param name="encodingName">Encoding name for EightBitByte</param>
        /// <returns>VersionDetail and ECI</returns>
        internal static VersionControlStruct InitialSetup(int dataBitsLength, ErrorCorrectionLevel level, string encodingName)
        {
            int totalDataBits = dataBitsLength;

            bool containECI = false;

            BitList eciHeader = new BitList();

            if (encodingName is not DefaultEncoding and not QRCodeConstantVariable.UTF8Encoding)
            {
                ECISet eciSet   = new ECISet(ECISet.AppendOption.NameToValue);
                int    eciValue = eciSet.GetECIValueByName(encodingName);

                totalDataBits += ECISet.NumOfECIHeaderBits(eciValue);
                eciHeader      = eciSet.GetECIHeader(encodingName);
                containECI     = true;
            }

            // Determine which version group it belong to
            int searchGroup = DynamicSearchIndicator(totalDataBits, level);

            int[] charCountIndicator = CharCountIndicatorTable.GetCharCountIndicatorSet();

            totalDataBits += (NumBitsModeIndicator + charCountIndicator[searchGroup]);

            int lowerSearchBoundary  = searchGroup == 0 ? 1 : (VERSION_GROUP[searchGroup - 1] + 1);
            int higherSearchBoundary = VERSION_GROUP[searchGroup];

            // Binary search to find proper version
            int versionNum = BinarySearch(totalDataBits, level, lowerSearchBoundary, higherSearchBoundary);

            VersionControlStruct vcStruct = FillVCStruct(versionNum, level);

            vcStruct.IsContainECI = containECI;

            vcStruct.ECIHeader = eciHeader;

            return(vcStruct);
        }