Как найти начало строки ASCII в байтовом массиве, созданном сериализацией в C # - PullRequest
0 голосов
/ 20 марта 2019

Я мог бы сделать этот вопрос немного более полным.Вот что я пытаюсь сделать.Несколько лет назад моя команда создала настраиваемую библиотеку пользовательского интерфейса на основе исходного кода другой коммерческой библиотеки.Мы изменили названия сборок с оригинала, чтобы отразить, что они были настроены.Сейчас мы переходим на ненастроенные версии этой библиотеки и столкнулись с проблемами чтения двоичных ресурсов.На самом деле, это всего лишь один ресурс: коллекция изображений.Проблема в том, что информация о сборке встроена в двоичный поток.Невозможно воссоздать объект, поскольку исходная сборка недоступна и недоступна при обращении к новой библиотеке.

Одно из решений заключается в замене имени сборки, версии и т. Д. Непосредственно в байтовом массиве, который хранится какресурс.Я добился больших успехов в этом, прочитав строку Base64 из файла Resx, преобразовав ее в байты, заменив имя, затем переупаковав и сохранив файл.Тем не менее, строки не совсем одинаковой длины.Это вызвало ошибку о двоичном заголовке.Это на самом деле имеет смысл, потому что сериализатор должен предшествовать строке с длиной строки.Я проверил это и вручную изменил значение длины в отладчике.

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

Таким образом, здесь действительно два вопроса: 1) заданный вопрос и 2) можно ли как-то десериализовать некоторые базовые поля из байтового массива, не создаваяэкземпляр оригинального объекта?Выполнение этого как исходного объекта приводит к возникновению исключений, даже если вы действительно можете видеть элементы в отладчике (этого недостаточно для построения преобразователя).Если бы я мог десериализовать достаточно, чтобы найти строковые объекты, я мог бы легче заменить строковые фрагменты и записать все строки обратно в сериализованный объект с обновленными длинами.

Надеюсь, это имеет смысл.Хотя это довольно конкретно, знание того, как это работает, может быть очень полезно для людей, кроме меня.

...