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(СоединитьДвоичныеДанные(езультат)); }