Example #1
0
        // Make bit vector of type information. On success, store the result in "bits" and return true.
        // Encode error correction level and mask pattern. See 8.9 of
        // JISX0510:2004 (p.45) for details.
        internal static void makeTypeInfoBits(ErrorCorrectionLevelInternal m_EcLevelInternal, int maskPattern, BitVector bits)
        {
            if (!QRCodeInternal.isValidMaskPattern(maskPattern))
            {
                throw new WriterException("Invalid mask pattern");
            }
            int typeInfo = (m_EcLevelInternal.Bits << 3) | maskPattern;

            bits.appendBits(typeInfo, 5);

            int bchCode = calculateBCHCode(typeInfo, TYPE_INFO_POLY);

            bits.appendBits(bchCode, 10);

            BitVector maskBits = new BitVector();

            maskBits.appendBits(TYPE_INFO_MASK_PATTERN, 15);
            bits.xor(maskBits);

            if (bits.size() != 15)
            {
                // Just in case.
                throw new WriterException("should not happen but we got: " + bits.size());
            }
        }
Example #2
0
		internal static void  encode(System.String content, ErrorCorrectionLevelInternal m_EcLevelInternal, System.Collections.Hashtable hints, QRCodeInternal qrCodeInternal)
		{
			
			System.String encoding = hints == null?null:(System.String) hints[EncodeHintType.CHARACTER_SET];
			if (encoding == null)
			{
				encoding = DEFAULT_BYTE_MODE_ENCODING;
			}
			
			// Step 1: Choose the mode (encoding).
			Mode mode = chooseMode(content, encoding);
			
			// Step 2: Append "bytes" into "dataBits" in appropriate encoding.
			BitVector dataBits = new BitVector();
			appendBytes(content, mode, dataBits, encoding);
			// Step 3: Initialize QR code that can contain "dataBits".
			int numInputBytes = dataBits.sizeInBytes();
			initQRCode(numInputBytes, m_EcLevelInternal, mode, qrCodeInternal);
			
			// Step 4: Build another bit vector that contains header and data.
			BitVector headerAndDataBits = new BitVector();
			
			// Step 4.5: Append ECI message if applicable
			if (mode == Mode.BYTE && !DEFAULT_BYTE_MODE_ENCODING.Equals(encoding))
			{
				CharacterSetECI eci = CharacterSetECI.getCharacterSetECIByName(encoding);
				if (eci != null)
				{
					appendECI(eci, headerAndDataBits);
				}
			}
			
			appendModeInfo(mode, headerAndDataBits);
			
			int numLetters = mode.Equals(Mode.BYTE)?dataBits.sizeInBytes():content.Length;
			appendLengthInfo(numLetters, qrCodeInternal.Version, mode, headerAndDataBits);
			headerAndDataBits.appendBitVector(dataBits);
			
			// Step 5: Terminate the bits properly.
			terminateBits(qrCodeInternal.NumDataBytes, headerAndDataBits);
			
			// Step 6: Interleave data bits with error correction code.
			BitVector finalBits = new BitVector();
			interleaveWithECBytes(headerAndDataBits, qrCodeInternal.NumTotalBytes, qrCodeInternal.NumDataBytes, qrCodeInternal.NumRSBlocks, finalBits);
			
			// Step 7: Choose the mask pattern and set to "QRCodeInternal".
			ByteMatrix matrix = new ByteMatrix(qrCodeInternal.MatrixWidth, qrCodeInternal.MatrixWidth);
			qrCodeInternal.MaskPattern = chooseMaskPattern(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, matrix);
			
			// Step 8.  Build the matrix and set it to "QRCodeInternal".
			MatrixUtil.buildMatrix(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, qrCodeInternal.MaskPattern, matrix);
			qrCodeInternal.Matrix = matrix;
			// Step 9.  Make sure we have a valid QR Code.
			if (!qrCodeInternal.Valid)
			{
				throw new WriterException("Invalid QR code: " + qrCodeInternal.ToString());
			}
		}
Example #3
0
		private void ZXEncode(string content, int option)
		{
			System.String encoding = QRCodeConstantVariable.DefaultEncoding;
			ErrorCorrectionLevelInternal m_EcLevelInternal = ErrorCorrectionLevelInternal.H;
			QRCodeInternal qrCodeInternal = new QRCodeInternal();
			
			// Step 1: Choose the mode (encoding).
			Mode mode = EncoderInternal.chooseMode(content, encoding);
			
			// Step 2: Append "bytes" into "dataBits" in appropriate encoding.
			BitVector dataBits = new BitVector();
			EncoderInternal.appendBytes(content, mode, dataBits, encoding);
			// Step 3: Initialize QR code that can contain "dataBits".
			int numInputBytes = dataBits.sizeInBytes();
			EncoderInternal.initQRCode(numInputBytes, m_EcLevelInternal, mode, qrCodeInternal);
			
			// Step 4: Build another bit vector that contains header and data.
			BitVector headerAndDataBits = new BitVector();
			
			// Step 4.5: Append ECI message if applicable
			if (mode == Mode.BYTE && !QRCodeConstantVariable.DefaultEncoding.Equals(encoding))
			{
				CharacterSetECI eci = CharacterSetECI.getCharacterSetECIByName(encoding);
				if (eci != null)
				{
					EncoderInternal.appendECI(eci, headerAndDataBits);
				}
			}
			
			EncoderInternal.appendModeInfo(mode, headerAndDataBits);
			
			int numLetters = mode.Equals(Mode.BYTE)?dataBits.sizeInBytes():content.Length;
			EncoderInternal.appendLengthInfo(numLetters, qrCodeInternal.Version, mode, headerAndDataBits);
			headerAndDataBits.appendBitVector(dataBits);
			
			// Step 5: Terminate the bits properly.
			EncoderInternal.terminateBits(qrCodeInternal.NumDataBytes, headerAndDataBits);
			
			// Step 6: Interleave data bits with error correction code.
			BitVector finalBits = new BitVector();
			EncoderInternal.interleaveWithECBytes(headerAndDataBits, qrCodeInternal.NumTotalBytes, qrCodeInternal.NumDataBytes, qrCodeInternal.NumRSBlocks, finalBits);
			
			if(option == 3)
			{
				return;
			}
			
			// Step 7: Choose the mask pattern and set to "QRCodeInternal".
			ByteMatrix matrix = new ByteMatrix(qrCodeInternal.MatrixWidth, qrCodeInternal.MatrixWidth);
			qrCodeInternal.MaskPattern = EncoderInternal.chooseMaskPattern(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, matrix);
			
			// Step 8.  Build the matrix and set it to "QRCodeInternal".
			MatrixUtil.buildMatrix(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, qrCodeInternal.MaskPattern, matrix);
			qrCodeInternal.Matrix = matrix;
			
		}
Example #4
0
        // Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask
        // pattern conditions.
        internal static bool getDataMaskBit(int maskPattern, int x, int y)
        {
            if (!QRCodeInternal.isValidMaskPattern(maskPattern))
            {
                throw new System.ArgumentException("Invalid mask pattern");
            }
            int intermediate, temp;

            switch (maskPattern)
            {
            case 0:
                intermediate = (y + x) & 0x1;
                break;

            case 1:
                intermediate = y & 0x1;
                break;

            case 2:
                intermediate = x % 3;
                break;

            case 3:
                intermediate = (y + x) % 3;
                break;

            case 4:
                intermediate = ((SupportClass.URShift(y, 1)) + (x / 3)) & 0x1;
                break;

            case 5:
                temp         = y * x;
                intermediate = (temp & 0x1) + (temp % 3);
                break;

            case 6:
                temp         = y * x;
                intermediate = (((temp & 0x1) + (temp % 3)) & 0x1);
                break;

            case 7:
                temp         = y * x;
                intermediate = (((temp % 3) + ((y + x) & 0x1)) & 0x1);
                break;

            default:
                throw new System.ArgumentException("Invalid mask pattern: " + maskPattern);
            }
            return(intermediate == 0);
        }
		/// <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 #6
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]);
			
		}
Example #7
0
		private void PTest(int contentLength)
		{
			Stopwatch sw = new Stopwatch();
			int timesofTest = 1000;
			
			string[] timeElapsed = new string[2];
			sw.Start();
			
			for(int i = 0; i < timesofTest; i++)
			{
				VersionControl.InitialSetup(contentLength, Mode.Alphanumeric, ErrorCorrectionLevel.H, QRCodeConstantVariable.DefaultEncoding);
			}
			
			sw.Stop();
			
			timeElapsed[0] = sw.ElapsedMilliseconds.ToString();
			
			sw.Reset();
			
			QRCodeInternal qrInternal = new QRCodeInternal();
			
			int byteLength = contentLength / 8;
			
			sw.Start();
			
			for(int i = 0; i < timesofTest; i++)
			{
				EncoderInternal.initQRCode(byteLength, ErrorCorrectionLevelInternal.H, ZMode.ALPHANUMERIC, qrInternal);
			}
			
			sw.Stop();
			
			timeElapsed[1] = sw.ElapsedMilliseconds.ToString();
			
			
			Assert.Pass("VersionControl {0} Tests~ QrCode.Net: {1} ZXing: {2}", timesofTest, timeElapsed[0], timeElapsed[1]);
			
		}
Example #8
0
        internal static void encode(System.String content, ErrorCorrectionLevelInternal m_EcLevelInternal, System.Collections.Hashtable hints, QRCodeInternal qrCodeInternal)
        {
            System.String encoding = hints == null ? null : (System.String)hints[EncodeHintType.CHARACTER_SET];
            if (encoding == null)
            {
                encoding = DEFAULT_BYTE_MODE_ENCODING;
            }

            // Step 1: Choose the mode (encoding).
            Mode mode = chooseMode(content, encoding);

            // Step 2: Append "bytes" into "dataBits" in appropriate encoding.
            BitVector dataBits = new BitVector();

            appendBytes(content, mode, dataBits, encoding);
            // Step 3: Initialize QR code that can contain "dataBits".
            int numInputBytes = dataBits.sizeInBytes();

            initQRCode(numInputBytes, m_EcLevelInternal, mode, qrCodeInternal);

            // Step 4: Build another bit vector that contains header and data.
            BitVector headerAndDataBits = new BitVector();

            // Step 4.5: Append ECI message if applicable
            if (mode == Mode.BYTE && !DEFAULT_BYTE_MODE_ENCODING.Equals(encoding))
            {
                CharacterSetECI eci = CharacterSetECI.getCharacterSetECIByName(encoding);
                if (eci != null)
                {
                    appendECI(eci, headerAndDataBits);
                }
            }

            appendModeInfo(mode, headerAndDataBits);

            int numLetters = mode.Equals(Mode.BYTE) ? dataBits.sizeInBytes() : content.Length;

            appendLengthInfo(numLetters, qrCodeInternal.Version, mode, headerAndDataBits);
            headerAndDataBits.appendBitVector(dataBits);

            // Step 5: Terminate the bits properly.
            terminateBits(qrCodeInternal.NumDataBytes, headerAndDataBits);

            // Step 6: Interleave data bits with error correction code.
            BitVector finalBits = new BitVector();

            interleaveWithECBytes(headerAndDataBits, qrCodeInternal.NumTotalBytes, qrCodeInternal.NumDataBytes, qrCodeInternal.NumRSBlocks, finalBits);

            // Step 7: Choose the mask pattern and set to "QRCodeInternal".
            ByteMatrix matrix = new ByteMatrix(qrCodeInternal.MatrixWidth, qrCodeInternal.MatrixWidth);

            qrCodeInternal.MaskPattern = chooseMaskPattern(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, matrix);

            // Step 8.  Build the matrix and set it to "QRCodeInternal".
            MatrixUtil.buildMatrix(finalBits, qrCodeInternal.EcLevelInternal, qrCodeInternal.Version, qrCodeInternal.MaskPattern, matrix);
            qrCodeInternal.Matrix = matrix;
            // Step 9.  Make sure we have a valid QR Code.
            if (!qrCodeInternal.Valid)
            {
                throw new WriterException("Invalid QR code: " + qrCodeInternal.ToString());
            }
        }
Example #9
0
 /// <summary>  Encode "bytes" with the error correction level "m_EcLevelInternal". The encoding mode will be chosen
 /// internally by chooseMode(). On success, store the result in "QRCodeInternal".
 ///
 /// We recommend you to use QRCodeInternal.EC_LEVEL_L (the lowest level) for
 /// "getECLevel" since our primary use is to show QR code on desktop screens. We don't need very
 /// strong error correction for this purpose.
 ///
 /// Note that there is no way to encode bytes in MODE_KANJI. We might want to add EncodeWithMode()
 /// with which clients can specify the encoding mode. For now, we don't need the functionality.
 /// </summary>
 public static void encode(System.String content, ErrorCorrectionLevelInternal m_EcLevelInternal, QRCodeInternal qrCodeInternal)
 {
     encode(content, m_EcLevelInternal, null, qrCodeInternal);
 }
Example #10
0
        /// <summary> Initialize "QRCodeInternal" according to "numInputBytes", "m_EcLevelInternal", and "mode". On success,
        /// modify "QRCodeInternal".
        /// </summary>
        internal static void initQRCode(int numInputBytes, ErrorCorrectionLevelInternal m_EcLevelInternal, Mode mode, QRCodeInternal qrCodeInternal)
        {
            qrCodeInternal.EcLevelInternal = m_EcLevelInternal;
            qrCodeInternal.Mode            = mode;

            // In the following comments, we use numbers of Version 7-H.
            for (int versionNum = 1; versionNum <= 40; versionNum++)
            {
                Version version = Version.getVersionForNumber(versionNum);
                // numBytes = 196
                int numBytes = version.TotalCodewords;
                // getNumECBytes = 130
                Version.ECBlocks ecBlocks = version.getECBlocksForLevel(m_EcLevelInternal);
                int numEcBytes            = ecBlocks.TotalECCodewords;
                // getNumRSBlocks = 5
                int numRSBlocks = ecBlocks.NumBlocks;
                // getNumDataBytes = 196 - 130 = 66
                int numDataBytes = numBytes - numEcBytes;
                // We want to choose the smallest version which can contain data of "numInputBytes" + some
                // extra bits for the header (mode info and length info). The header can be three bytes
                // (precisely 4 + 16 bits) at most. Hence we do +3 here.
                if (numDataBytes >= numInputBytes + 3)
                {
                    // Yay, we found the proper rs block info!
                    qrCodeInternal.Version       = versionNum;
                    qrCodeInternal.NumTotalBytes = numBytes;
                    qrCodeInternal.NumDataBytes  = numDataBytes;
                    qrCodeInternal.NumRSBlocks   = numRSBlocks;
                    // getNumECBytes = 196 - 66 = 130
                    qrCodeInternal.NumECBytes = numEcBytes;
                    // matrix width = 21 + 6 * 4 = 45
                    qrCodeInternal.MatrixWidth = version.DimensionForVersion;
                    return;
                }
            }
            throw new WriterException("Cannot find proper rs block info (input data too big?)");
        }
Example #11
0
		/// <summary>  Encode "bytes" with the error correction level "m_EcLevelInternal". The encoding mode will be chosen
		/// internally by chooseMode(). On success, store the result in "QRCodeInternal".
		/// 
		/// We recommend you to use QRCodeInternal.EC_LEVEL_L (the lowest level) for
		/// "getECLevel" since our primary use is to show QR code on desktop screens. We don't need very
		/// strong error correction for this purpose.
		/// 
		/// Note that there is no way to encode bytes in MODE_KANJI. We might want to add EncodeWithMode()
		/// with which clients can specify the encoding mode. For now, we don't need the functionality.
		/// </summary>
		public static void  encode(System.String content, ErrorCorrectionLevelInternal m_EcLevelInternal, QRCodeInternal qrCodeInternal)
		{
			encode(content, m_EcLevelInternal, null, qrCodeInternal);
		}
Example #12
0
		/// <summary> Initialize "QRCodeInternal" according to "numInputBytes", "m_EcLevelInternal", and "mode". On success,
		/// modify "QRCodeInternal".
		/// </summary>
		internal static void  initQRCode(int numInputBytes, ErrorCorrectionLevelInternal m_EcLevelInternal, Mode mode, QRCodeInternal qrCodeInternal)
		{
			qrCodeInternal.EcLevelInternal = m_EcLevelInternal;
			qrCodeInternal.Mode = mode;
			
			// In the following comments, we use numbers of Version 7-H.
			for (int versionNum = 1; versionNum <= 40; versionNum++)
			{
				Version version = Version.getVersionForNumber(versionNum);
				// numBytes = 196
				int numBytes = version.TotalCodewords;
				// getNumECBytes = 130
				Version.ECBlocks ecBlocks = version.getECBlocksForLevel(m_EcLevelInternal);
				int numEcBytes = ecBlocks.TotalECCodewords;
				// getNumRSBlocks = 5
				int numRSBlocks = ecBlocks.NumBlocks;
				// getNumDataBytes = 196 - 130 = 66
				int numDataBytes = numBytes - numEcBytes;
				// We want to choose the smallest version which can contain data of "numInputBytes" + some
				// extra bits for the header (mode info and length info). The header can be three bytes
				// (precisely 4 + 16 bits) at most. Hence we do +3 here.
				if (numDataBytes >= numInputBytes + 3)
				{
					// Yay, we found the proper rs block info!
					qrCodeInternal.Version = versionNum;
					qrCodeInternal.NumTotalBytes = numBytes;
					qrCodeInternal.NumDataBytes = numDataBytes;
					qrCodeInternal.NumRSBlocks = numRSBlocks;
					// getNumECBytes = 196 - 66 = 130
					qrCodeInternal.NumECBytes = numEcBytes;
					// matrix width = 21 + 6 * 4 = 45
					qrCodeInternal.MatrixWidth = version.DimensionForVersion;
					return ;
				}
			}
			throw new WriterException("Cannot find proper rs block info (input data too big?)");
		}