示例#1
0
        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);
        }
示例#2
0
        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]);
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
        }