Сравнение двух ByteArrays C # - PullRequest
1 голос
/ 15 декабря 2009

У меня есть тест, который загружает bytearray (image - jpg) в нашу базу данных (Sql Server FileStream) и затем извлекает его через HttpHandler. Далее я сравниваю два.

Теперь они почти одинаковы, за исключением первых четырех байтов ...

Что в этих первых четырех байтах?

Первый byteArray: 255, 216, 255, 224, с этого момента они одинаковы

Второй байтовый массив: 63, 63, 63, 63 ...

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

Обновление

StringWriter writer;
SimpleWorkerRequest worker;

writer = new StringWriter();
worker = new SimpleWorkerRequest(page, query, writer);
HttpRuntime.ProcessRequest(worker);
writer.Flush();

var  encoding=new ASCIIEncoding();
var blob = encoding.GetBytes(writer.GetStringBuilder().ToString());

return blob;

Ответы [ 5 ]

12 голосов
/ 15 декабря 2009

Если вы хотите знать, почему это происходит, то это потому, что кодировка ASCII не может обрабатывать символы выше 128. Первые четыре символа преобразуются в '?'.

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

4 голосов
/ 15 декабря 2009

Согласно статье Википедии , эти первые четыре байта:

  • 0xFFD8 Начало изображения
  • 0xFFEn Маркер для конкретного приложения

Ваш 0xFFE0, который является маркером APP0, требуется после начала изображения. См. www.w3.org / Graphics / JPEG / jfif3.pdf , раздел, озаглавленный «Маркер APP0, используемый для идентификации JPEG FIF».

1 голос
/ 15 декабря 2009

Немодифицированный SimpleWorkerRequest не подходит для приема двоичных данных. Позвольте мне процитировать от MSDN (выделение мной):

Чтобы обеспечить более широкие функциональные возможности, такие как предоставление размещенного содержимого и заголовков и захват заголовков ответа или тела ответа в виде двоичных данных , необходимо расширить SimpleWorkerRequest и переопределить соответствующие методы HttpWorkerRequest.

1 голос
/ 15 декабря 2009

Класс Writer - это поток кодирования текста, по звуку которого вы используете StreamWriter, который является реализацией System.IO.TextWriter. Это неверно Вы должны использовать двоичный поток для записи данных в своем собственном формате.

Надеюсь, что это поможет дать вам подсказку в том направлении, которое вы ищете, С наилучшими пожеланиями, Том.

0 голосов
/ 15 декабря 2009

Если ваша цель состоит в том, чтобы просто заставить его работать и вы можете изменить схему базы данных, вы можете пойти с этим сообщением: http://blogs.msdn.com/domgreen/archive/2009/09/06/comparing-two-images-in-c.aspx

Автор использует кодировку base64 для сравнения существующих изображений, но вы могли быиспользуйте кодировку для хранения изображения в БД примерно таким же образом.

br, Марсель

...