private static void FillArray(Массив currentArray, int bound) { for (int i = 0; i < bound; i++) { currentArray._values.Add(null); } }
public static Массив Новый(Массив fixedArray) { if (!(fixedArray is Массив val)) { throw new Exception("InvalidArgumentType"); } return(new Массив(val)); }
private static Массив CloneArray(Массив cloneable) { Массив clone = new Массив(); foreach (var item in cloneable._values) { clone._values.Add(item); } return(clone); }
/// <summary> /// Объединяет несколько объектов типа ДвоичныеДанные в один. /// </summary> /// <param name="array">Массив объектов типа ДвоичныеДанные.</param> /// <returns>Тип: ДвоичныеДанные.</returns> public static ДвоичныеДанные СоединитьДвоичныеДанные(Массив array) { // Сделано на int т.к. BinaryContext.Size имеет тип int; using (var stream = new System.IO.MemoryStream()) { foreach (var cbd in array) { byte[] buffer = ((ДвоичныеДанные)cbd).Buffer; stream.Write(buffer, 0, buffer.Length); } return(new ДвоичныеДанные(stream.ToArray())); } }
/// <summary> /// Позволяет задать измерения массива при его создании /// </summary> /// <param name="dimensions">Числовые размерности массива. Например, "Массив(2,3)", создает двумерный массив 2х3.</param> /// <returns></returns> public static Массив Constructor(int[] dimensions) { Массив cloneable = null; for (int dim = dimensions.Length - 1; dim >= 0; dim--) { int bound = dimensions[dim]; var newInst = new Массив(); FillArray(newInst, bound); if (cloneable != null) { for (int i = 0; i < bound; i++) { newInst._values[i] = CloneArray(cloneable); } } cloneable = newInst; } return(cloneable); }
/// <summary> /// Разделяет двоичные данные на части заданного размера. Размер задается в байтах. /// </summary> /// <param name="data">Объект типа ДвоичныеДанные.</param> /// <param name="size">Размер одной части данных.</param> /// <returns>Массив объектов типа ДвоичныеДанные.</returns> public static Массив азделитьДвоичныеДанные(ДвоичныеДанные data, int size) { // Сделано на int т.к. BinaryContext.Size имеет тип int; Массив array = new Массив(); int readedBytes = 0; while (readedBytes < data.Buffer.Length) { int bytesToRead = size; if (bytesToRead > data.Buffer.Length - readedBytes) { bytesToRead = data.Buffer.Length - readedBytes; } byte[] buffer = new byte[bytesToRead]; Buffer.BlockCopy(data.Buffer, readedBytes, buffer, 0, bytesToRead); readedBytes += bytesToRead; array.Добавить(new ДвоичныеДанные(buffer)); } return(array); }
/// <summary> /// Соединяет массив переданных строк в одну строку с указанным разделителем /// </summary> /// <param name="input">Массив - соединяемые строки</param> /// <param name="delimiter">Разделитель. Если не указан, строки объединяются слитно</param> public static string Соединить(Массив input, string delimiter = null) { var strings = input.Select(x => x); return(String.Join(delimiter, strings)); }
public object ДвоичныеДанныеВСтруктуру(object Данные, object знСтруктура = null) { БуферДвоичныхДанных бдДанные; long рдДанные; if (Данные is ДвоичныеДанные) { ДвоичныеДанные дд = Данные as ДвоичныеДанные; рдДанные = дд.азмер(); if (рдДанные == 0) { return(null); } бдДанные = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(дд); } else if (Данные is БуферДвоичныхДанных) { бдДанные = Данные as БуферДвоичныхДанных; рдДанные = бдДанные.азмер; } else { return(null); } var Позиция = 0; if (знСтруктура is null) { знСтруктура = Структура.Новый(); } while (Позиция < рдДанные - 1) { var рдКлюч = бдДанные.ПрочитатьЦелое16(Позиция); var рдЗначение = бдДанные.ПрочитатьЦелое32(Позиция + 2); if (рдКлюч + рдЗначение > рдДанные) // Это не структура { return(null); } var Ключ = ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(бдДанные.Прочитать(Позиция + 6, рдКлюч))); var бЗначение = бдДанные.Прочитать(Позиция + 6 + рдКлюч, рдЗначение); Позиция = Позиция + 6 + рдКлюч + рдЗначение; object Значение; var Л = Лев(Ключ, 1); if (Л == "*") { Ключ = Сред(Ключ, 2); Значение = ДвоичныеДанныеВСтруктуру(бЗначение, Структура.Новый()); } else if (Л == "&") { Ключ = Сред(Ключ, 2); Значение = ДвоичныеДанныеВСтруктуру(бЗначение, Соответствие.Новый()); } else if (Л == "$") { Ключ = Сред(Ключ, 2); Значение = ДвоичныеДанныеВСтруктуру(бЗначение, Массив.Новый()); } else if (Л == "#") { Ключ = Сред(Ключ, 2); Значение = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(бЗначение); } else if (Л == "^") { Ключ = Сред(Ключ, 2); Значение = null; } else { Значение = ПолучитьСтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(бЗначение)); if (Л == "!") { Ключ = Сред(Ключ, 2); Значение = Число(Значение); } } if (Ключ == "") { (знСтруктура as Массив).Добавить(Значение); } else { (знСтруктура as Структура).Вставить(Ключ, Значение); } } return(знСтруктура); }
public ДвоичныеДанные СтруктуруВДвоичныеДанные(object знСтруктура) { var езультат = Массив.Новый(); if (знСтруктура != Неопределено) { foreach (object Элемент in знСтруктура as IEnumerable <object> ) { string Ключ = ""; object Значение; ДвоичныеДанные дЗначение = null; if (знСтруктура is Массив) { Ключ = ""; Значение = Элемент; } else { Ключ = (string)(Элемент as КлючИЗначение).Ключ; Значение = (Элемент as КлючИЗначение).Значение; } if (Значение is Структура) { Ключ = "*" + Ключ; дЗначение = СтруктуруВДвоичныеДанные((Структура)Значение); } else if (Значение is Соответствие) { Ключ = "&" + Ключ; дЗначение = СтруктуруВДвоичныеДанные((Соответствие)Значение); } else if (Значение is Массив) { Ключ = "$" + Ключ; дЗначение = СтруктуруВДвоичныеДанные((Массив)Значение); } else if (Значение is ДвоичныеДанные) { Ключ = "#" + Ключ; дЗначение = Значение as ДвоичныеДанные; } else if (Значение is null) { Ключ = "^" + Ключ; дЗначение = ПолучитьДвоичныеДанныеИзСтроки(""); } else { if (Значение is int || Значение is decimal) { Ключ = "!" + Ключ; } дЗначение = ПолучитьДвоичныеДанныеИзСтроки(Значение.ToString()); } var дКлюч = ПолучитьДвоичныеДанныеИзСтроки(Ключ); var рдКлюч = дКлюч.азмер(); var рдЗначение = дЗначение.азмер(); var бРезультат = БуферДвоичныхДанных.Новый(6); бРезультат.ЗаписатьЦелое16(0, рдКлюч); бРезультат.ЗаписатьЦелое32(2, рдЗначение); езультат.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(бРезультат)); езультат.Добавить(дКлюч); езультат.Добавить(дЗначение); } } return(СоединитьДвоичныеДанные(езультат)); }
public ДвоичныеДанные СоединитьДвоичныеДанные(Массив arg) { return(GlobalBinaryData.СоединитьДвоичныеДанные(arg)); }
public object ВызватьМетод(object obj, string metodname, Массив par) { var m = obj.GetType().GetMethod(metodname); return(m.Invoke(obj, par.Arr)); }