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); } }
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; }
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)); }
/// <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); } }
/// <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); }
/// <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); }