Ejemplo n.º 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);
            }
        }
Ejemplo n.º 2
0
        private static string EightBitByteRecognision(string content, int startPos, int contentLength)
        {
            if(string.IsNullOrEmpty(content))
                throw new ArgumentNullException("content", "Input content is null or empty");

            ECISet eciSets = new ECISet(ECISet.AppendOption.NameToValue);

            Dictionary<string, int> eciSet = eciSets.GetECITable();

            //we will not check for utf8 encoding.
            eciSet.Remove(QRCodeConstantVariable.UTF8Encoding);
            eciSet.Remove(QRCodeConstantVariable.DefaultEncoding);

            int scanPos = startPos;
            //default encoding as priority
            scanPos = ModeEncodeCheck.TryEncodeEightBitByte(content, QRCodeConstantVariable.DefaultEncoding, scanPos, contentLength);
            if(scanPos == -1)
                return QRCodeConstantVariable.DefaultEncoding;

            foreach(KeyValuePair<string, int> kvp in eciSet)
            {
                scanPos = ModeEncodeCheck.TryEncodeEightBitByte(content, kvp.Key, scanPos, contentLength);
                if(scanPos == -1)
                {
                    return kvp.Key;
                }

            }

            if(scanPos == -1)
                throw new ArgumentException("foreach Loop check give wrong result.");
            else
                return QRCodeConstantVariable.UTF8Encoding;
        }
Ejemplo n.º 3
0
    internal override BitList GetDataBits(string content)
    {
        var eciSet = new ECISet(ECISet.AppendOption.NameToValue);

        if (!eciSet.ContainsECIName(Encoding))
        {
            throw new ArgumentOutOfRangeException(
                      nameof(Encoding),
                      $"Current ECI table does not support this encoding. Please check {nameof(ECISet)} class for more info.");
        }

        byte[] contentBytes = EncodeContent(content, Encoding);

        return(GetDataBitsByByteArray(contentBytes, Encoding));
    }
Ejemplo n.º 4
0
        /// <summary>
        /// Eights the bit byte recognision.
        /// </summary>
        /// <param name="content">The content.</param>
        /// <param name="startPos">The start pos.</param>
        /// <param name="contentLength">Length of the content.</param>
        /// <returns></returns>
        /// <remarks></remarks>
        private static string EightBitByteRecognision(string content, int startPos, int contentLength)
        {
            if (string.IsNullOrEmpty(content))
            {
                throw new ArgumentNullException("content", "Input content is null or empty");
            }

            var eciSets = new ECISet(ECISet.AppendOption.NameToValue);

            Dictionary <string, int> eciSet = eciSets.GetECITable();


            //we will not check for utf8 encoding.
            eciSet.Remove(QRCodeConstantVariable.UTF8Encoding);
            eciSet.Remove(QRCodeConstantVariable.DefaultEncoding);

            int scanPos = startPos;

            //default encoding as priority
            scanPos = ModeEncodeCheck.TryEncodeEightBitByte(content, QRCodeConstantVariable.DefaultEncoding, scanPos,
                                                            contentLength);
            if (scanPos == -1)
            {
                return(QRCodeConstantVariable.DefaultEncoding);
            }

            foreach (var kvp in eciSet)
            {
                scanPos = ModeEncodeCheck.TryEncodeEightBitByte(content, kvp.Key, scanPos, contentLength);
                if (scanPos == -1)
                {
                    return(kvp.Key);
                }
            }

            if (scanPos == -1)
            {
                throw new ArgumentException("foreach Loop check give wrong result.");
            }
            else
            {
                return(QRCodeConstantVariable.UTF8Encoding);
            }
        }
Ejemplo n.º 5
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);
        }
Ejemplo n.º 6
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();

        if (encodingName is not DefaultEncoding and not QRCodeConstantVariable.UTF8Encoding)
        {
            ECISet eciSet   = new(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);
    }