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