Exemple #1
0
        private static bool TryAlphaNumericOnly(string data, Level correctionLevel, int version, out IEnumerable <EncodingSequence> sequences)
        {
            sequences = new List <EncodingSequence>();

            if (data.Length == 0)
            {
                return(false);
            }

            Logger.WriteLog($"TryAlphaNumericOnly");

            EncodingSequence seq = new EncodingSequence(correctionLevel, version)
            {
                Start = 0,
                Enc   = EncodingMode.AlphaNumeric
            };

            var result = new List <EncodingSequence> {
                seq
            };

            for (int i = 0; i < data.Length; i++)
            {
                char c = data[i];
                if (!CheckAlphaNumeric(c))
                {
                    return(false);
                }

                seq.AppendData(c);
            }

            sequences = result;
            return(true);
        }
Exemple #2
0
        private static IEnumerable <EncodingSequence> SplitByDataType(string data, Level correctionLevel, int version)
        {
            Logger.WriteLog("SplitByDataType");

            var result            = new List <EncodingSequence>();
            EncodingSequence last = null;

            for (int i = 0; i < data.Length; i++)
            {
                char c = data[i];

                if (CheckNumeric(c))
                {
                    last = AddToSequences(result, c, i, EncodingMode.Numeric, last, correctionLevel, version);
                    continue;
                }

                if (CheckAlphaNumeric(c))
                //    && (last.Enc == EncodingMode.AlphaNumeric || (i < data.Length - 1 && CheckAlphaNumeric(data[i + 1]))))
                {
                    last = AddToSequences(result, c, i, EncodingMode.AlphaNumeric, last, correctionLevel, version);
                    continue;
                }

                last = AddToSequences(result, c, i, EncodingMode.Bytes, last, correctionLevel, version);
            }

            Logger.WriteLog("SplitByDataType sequences:\r\n    " + string.Join("\r\n    ", result.Select((x, i) => $"{i}. \"{x.Data}\" [{x.Enc}]")));

            return(result);
        }
Exemple #3
0
        private static IEnumerable <EncodingSequence> BytesOnly(string data, Level correctionLevel, int version)
        {
            if (data.Length == 0)
            {
                return(Enumerable.Empty <EncodingSequence>());
            }

            Logger.WriteLog($"BytesOnly");

            EncodingSequence seq = new EncodingSequence(correctionLevel, version)
            {
                Start = 0,
                Enc   = EncodingMode.Bytes
            };

            var result = new List <EncodingSequence> {
                seq
            };

            for (int i = 0; i < data.Length; i++)
            {
                seq.AppendData(data[i]);
            }

            return(result);
        }
Exemple #4
0
        private static EncodingSequence AddToSequences(List <EncodingSequence> result, char c, int index, EncodingMode enc, EncodingSequence last,
                                                       Level correctionLevel, int version)
        {
            if (last == null || last.Enc != enc)
            {
                last = new EncodingSequence(correctionLevel, version)
                {
                    Start = index,
                    Enc   = enc
                };

                last.AppendData(c);
                result.Add(last);
            }
            else
            if (last.Enc == enc)
            {
                last.AppendData(c);
            }

            return(last);
        }
Exemple #5
0
        private static int EncodeSequences(Level correctionLevel, int codeVersion, bool useMinVersion, IEnumerable <EncodingSequence> dataSequences,
                                           out List <List <byte> > encodedSequences, out int minVersion)
        {
            Logger.WriteLog("EncodeSequences input:\r\n    " + string.Join("\r\n    ", dataSequences.Select((x, i) => $"{i}. \"{x.Data}\" [{x.Enc}]")));

            int           blocksCount = 0;
            StringBuilder sb          = new StringBuilder();

            foreach (EncodingSequence sequence in dataSequences)
            {
                sequence.Encode(codeVersion);
                if (!useMinVersion)
                {
                    sb.Append(sequence.EncodedData);
                }

                blocksCount += (int)Math.Ceiling(sequence.EncodedData.Length / 8.0);
            }

            minVersion = GetCodeVersionForBlocksCount(blocksCount, correctionLevel);

            if (useMinVersion)
            {
                foreach (EncodingSequence sequence in dataSequences)
                {
                    sequence.Encode(minVersion);
                    sb.Append(sequence.EncodedData);
                }
            }

            int usedVersion = useMinVersion ? minVersion : codeVersion;

            encodedSequences = EncodingSequence.GetBlocks(sb.ToString(), correctionLevel, usedVersion);
            Logger.WriteLog("EncodeSequences result blocks:\r\n    " +
                            string.Join("\r\n    ", encodedSequences.Select((x, i) => $"Block {i}. [{string.Join(" ", x.Select(d => Logger.ToHexString(d)))}]")));

            return(sb.Length);
        }