/// <summary>
        /// Combine Gma.QrCodeNet.Encoding input recognition method and version control method
        /// with legacy code. To create expected answer.
        /// This is base on assume Gma.QrCodeNet.Encoding input recognition and version control sometime
        /// give different result as legacy code.
        /// </summary>
        /// <param name="content"></param>
        /// <returns></returns>
        internal static BitVector DataEncodeUsingReferenceImplementation(string content, ErrorCorrectionLevel ecLevel, out QRCodeInternal qrInternal)
        {
            if (string.IsNullOrEmpty(content))
            {
                throw new ArgumentException("input string content can not be null or empty");
            }

            //Choose mode
            RecognitionStruct recognitionResult = InputRecognise.Recognise(content);
            string            encodingName      = recognitionResult.EncodingName;
            Mode mode = ConvertMode(recognitionResult.Mode);

            //append byte to databits
            BitVector dataBits = new BitVector();

            EncoderInternal.appendBytes(content, mode, dataBits, encodingName);

            int dataBitsLength            = dataBits.size();
            VersionControlStruct vcStruct =
                VersionControl.InitialSetup(dataBitsLength, recognitionResult.Mode, ecLevel, recognitionResult.EncodingName);
            //ECI
            BitVector headerAndDataBits = new BitVector();
            string    defaultByteMode   = "iso-8859-1";

            if (mode == Mode.BYTE && !defaultByteMode.Equals(encodingName))
            {
                CharacterSetECI eci = CharacterSetECI.getCharacterSetECIByName(encodingName);
                if (eci != null)
                {
                    EncoderInternal.appendECI(eci, headerAndDataBits);
                }
            }
            //Mode
            EncoderInternal.appendModeInfo(mode, headerAndDataBits);
            //Char info
            int numLetters = mode.Equals(Mode.BYTE)?dataBits.sizeInBytes():content.Length;

            EncoderInternal.appendLengthInfo(numLetters, vcStruct.VersionDetail.Version, mode, headerAndDataBits);
            //Combine with dataBits
            headerAndDataBits.appendBitVector(dataBits);

            // Terminate the bits properly.
            EncoderInternal.terminateBits(vcStruct.VersionDetail.NumDataBytes, headerAndDataBits);

            qrInternal                 = new QRCodeInternal();
            qrInternal.Version         = vcStruct.VersionDetail.Version;
            qrInternal.MatrixWidth     = vcStruct.VersionDetail.MatrixWidth;
            qrInternal.EcLevelInternal = ErrorCorrectionLevelConverter.ToInternal(ecLevel);
            qrInternal.NumTotalBytes   = vcStruct.VersionDetail.NumTotalBytes;
            qrInternal.NumDataBytes    = vcStruct.VersionDetail.NumDataBytes;
            qrInternal.NumRSBlocks     = vcStruct.VersionDetail.NumECBlocks;
            return(headerAndDataBits);
        }
Example #2
0
        public void QrPerformanceTest()
        {
            Stopwatch sw          = new Stopwatch();
            int       timesofTest = 1000;

            string[] timeElapsed = new string[2];
            string   testCase    = "sdg;alwsetuo1204985lkscvzlkjt;sdfjwltkja;slkdfjoiutLSAFAJ;GLKAJS;LDKJT;LKJ";

            QrEncoder encoder = new QrEncoder(ErrorCorrectionLevel.H);

            sw.Start();

            for (int i = 0; i < timesofTest; i++)
            {
                encoder.Encode(testCase);
            }

            sw.Stop();

            timeElapsed[0] = sw.ElapsedMilliseconds.ToString();

            sw.Reset();

            ErrorCorrectionLevelInternal level = ErrorCorrectionLevelConverter.ToInternal(ErrorCorrectionLevel.H);
            QRCodeInternal qrCodeInternal      = new QRCodeInternal();

            sw.Start();

            for (int i = 0; i < timesofTest; i++)
            {
                EncoderInternal.encode(testCase, level, qrCodeInternal);
            }
            sw.Stop();

            timeElapsed[1] = sw.ElapsedMilliseconds.ToString();


            Assert.Pass("Encode performance {0} Tests~ QrCode.Net: {1} ZXing: {2}", timesofTest, timeElapsed[0], timeElapsed[1]);
        }