public override (BitList, VersionInfo) Encode(string content, ErrorCorrectionLevel errorCorrectionLevel) { if (content == null) { throw new ArgumentNullException(nameof(content)); } byte[] data = TextEncoding.UTF8.GetBytes(content); EncodingMode encodingMode = EncodingMode.Byte; var versionInfo = VersionInfo.FindSmallestVersionInfo(errorCorrectionLevel, encodingMode, data.Length * 8); if (versionInfo == null) { throw new InvalidOperationException("Too much data to encode"); } var bits = new BitList(); bits.AddBits((uint)encodingMode, 4); bits.AddBits((uint)content.Length, versionInfo.CharCountBits(encodingMode)); foreach (var b in data) { bits.AddByte(b); } AddPaddingAndTerminator(ref bits, versionInfo); return(bits, versionInfo); }
public void AppendTo(ref BitList bits, byte[] text) { for (var i = 0; i < _shiftByteCount; i++) { if (i == 0 || (i == 31 && _shiftByteCount <= 62)) { // We need a header before the first character, and before // character 31 when the total byte code is <= 62 bits.AddBits(31, 5); // BINARY_SHIFT if (_shiftByteCount > 62) { bits.AddBits((uint)_shiftByteCount - 31, 16); } else if (i == 0) { // 1 <= binaryShiftByteCode <= 62 if (_shiftByteCount < 31) { bits.AddBits((uint)_shiftByteCount, 5); } else { bits.AddBits(31, 5); } } else { // 32 <= binaryShiftCount <= 62 and i == 31 bits.AddBits((uint)_shiftByteCount - 31, 5); } } bits.AddByte(text[_shiftStart + i]); } }
protected void AddPaddingAndTerminator(ref BitList bits, VersionInfo versionInfo) { int totalDataBits = versionInfo.TotalDataBytes() * 8; for (int i = 0; i < 4 && bits.Length < totalDataBits; i++) { bits.AddBit(false); } while (bits.Length % 8 != 0) { bits.AddBit(false); } for (int i = 0; bits.Length < totalDataBits; i++) { bits.AddByte((i % 2) == 0 ? (byte)236 : (byte)17); } }
private static BitList?GetCodeIndexList(char[] content) { var result = new BitList(); byte curEncoding = 0; for (var i = 0; i < content.Length; i++) { var nextChars = content.Skip(i).ToArray(); if (ShouldUseCTable(nextChars, curEncoding)) { if (curEncoding != Code128Constants.StartCSymbol) { if (curEncoding == 0) { result.AddByte(Code128Constants.StartCSymbol); } else { result.AddByte(Code128Constants.CodeCSymbol); } curEncoding = Code128Constants.StartCSymbol; } if (content[i] == Code128Constants.FNC1) { result.AddByte(102); } else { var idx = (content[i] - '0') * 10; i++; idx = idx + (content[i] - '0'); result.AddByte((byte)idx); } } else if (ShouldUseATable(nextChars, curEncoding)) { if (curEncoding != Code128Constants.StartASymbol) { if (curEncoding == 0) { result.AddByte(Code128Constants.StartASymbol); } else { result.AddByte(Code128Constants.CodeASymbol); } curEncoding = Code128Constants.StartASymbol; } int idx; switch (content[i]) { case Code128Constants.FNC1: idx = 102; break; case Code128Constants.FNC2: idx = 97; break; case Code128Constants.FNC3: idx = 96; break; case Code128Constants.FNC4: idx = 101; break; default: idx = Code128Constants.ATable.IndexOf(content[i]); break; } if (idx < 0) { return(null); } result.AddByte((byte)idx); } else { if (curEncoding != Code128Constants.StartBSymbol) { if (curEncoding == 0) { result.AddByte(Code128Constants.StartBSymbol); } else { result.AddByte(Code128Constants.CodeBSymbol); } curEncoding = Code128Constants.StartBSymbol; } int idx; switch (content[i]) { case Code128Constants.FNC1: idx = 102; break; case Code128Constants.FNC2: idx = 97; break; case Code128Constants.FNC3: idx = 96; break; case Code128Constants.FNC4: idx = 100; break; default: idx = Code128Constants.BTable.IndexOf(content[i]); break; } if (idx < 0) { return(null); } result.AddByte((byte)idx); } } return(result); }