Преобразование массива байтов BinarySerialized в удобочитаемую строку

Когда вы бинарно сериализуете объект в .Net с помощью BinaryFormatter, вы получаете массив байтов, который, очевидно, не имеет смысла для людей.

Соответствует ли этот байтовый массив более осмысленному строковому представлению, понятному человеку? Или вам нужно полностью десериализовать его, чтобы сделать его более понятным для человека?

Я ожидаю, что двоичный форматировщик имеет какое-то промежуточное строковое представление объекта, которое он использует перед отправкой массива байтов. Это было бы идеально для моих нужд...

Я пробовал кодировать массив байтов с помощью Base64, но в итоге получил тарабарщину.

РЕДАКТИРОВАТЬ:

Как объяснено в моем ответе, кодировка UTF8 - лучшее, что вы можете получить.

Причина, по которой я хочу это сделать, заключается в том, что я могу различать две двоичные сериализации и хранить только первую сериализацию и разницу, и мне было интересно посмотреть, как работает сериализация, чтобы понять, как лучше всего различать массив байтов.


person Yair Halberstadt    schedule 19.12.2018    source источник
comment
создайте строку, используя следующее: byte[] data = null; string bytes = string.Join( ,data.Select(x => x.ToString(x2)));   -  person jdweng    schedule 19.12.2018
comment
@jdweng Боюсь, это также приводит к тарабарщине ...   -  person Yair Halberstadt    schedule 19.12.2018
comment
См. stackoverflow.com/a/30176566/292411 пример вывода BinaryFormatter. Возможно, для программистов это не полная тарабарщина, но жена (или муж, смотря кто есть кто, а!) и не стала бы это читать.   -  person C.Evenhuis    schedule 19.12.2018
comment
Вы читаете целые числа из байтов. Предполагается, что число находится в определенном диапазоне? Двоичные данные обычно представляют собой комбинацию объектов разного размера, и вы должны считывать объекты на основе ожидаемого размера. Вы должны найти спецификацию двоичных данных и читать в соответствии со спецификацией. Можно читать разделы двоичного файла, если вы знаете структуру. Двоичные изображения обычно имеют заголовок ascii в начале, в котором указывается имя файла, тип изображения (например, jpeg) и размер изображения. Вы можете открыть изображение с помощью блокнота и увидеть заголовок ascii.   -  person jdweng    schedule 19.12.2018
comment
Двоичный формат не предназначен для чтения, а скорее для хранения/транспортировки/десериализации. Конечно, между объектом и его двоичной сериализованной формой нет ничего похожего на строку. Base64 используется только для передачи байтов в виде текста, шестнадцатеричный — для проверки чего-либо, если вы знаете точный формат данных. Иногда вы можете просто попытаться прочитать двоичный файл как текст (игнорируя ошибки), если он содержит ASCII, чтобы увидеть их. Не могли бы вы рассказать нам, что вы на самом деле хотите сделать?   -  person Sinatr    schedule 19.12.2018


Ответы (1)


Как анализировать содержимое потока двоичной сериализации? более подробно обсуждает формат бинарной сериализации, а также имеет ссылку на своего рода анализатор.

Там нет полностью удобочитаемого промежуточного представления, но использование Console.WriteLine(System.Text.Encoding.UTF8.GetString(bytes)); вернет что-то, что может быть работоспособным в зависимости от конкретных целей, для которых это необходимо.

Обратите внимание, что только некоторые байты могут быть декодированы с использованием UTF8, так как только части массива байтов закодированы в UTF8. В результирующей строке будет много unfound-symbold.

В качестве примера сериализации следующего и преобразования результата в строку UTF8:

namespace MyNamespace
{
    [Serializable]
    public class Class
    {
        private readonly int _int = 42;

        public string String { get; } = "MyString";
    }
}

приводит к:

"    ????          ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   MyNamespace.Class   _int<String>k__BackingField   *    MyString"

Что не совсем бесполезно...

person Yair Halberstadt    schedule 19.12.2018