public BitSquare Build(string data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } var qr = new QRCodeInternal(TypeNumber, ErrorCorrectLevel); qr.AddData(data); qr.Make(); var moduleCount = qr.ModuleCount; var bits = new BitSquare(moduleCount); for (var r = 0; r < moduleCount; r++) { for (var c = 0; c < moduleCount; c++) { bits[r, c] = qr.IsDark(r, c); } } return(bits); }
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; }
/// <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); }
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]); }
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]); }