比较两个ByteArrays C#

时间:2009-12-15 14:19:34

标签: c# image bytearray

我有一个测试,它将bytearray(image-jpg)上传到我们的数据库(Sql Server FileStream),然后通过HttpHandler检索它。接下来我比较两者。

现在,除了前四个字节外,它们几乎相同......

前四个字节中有什么?

第一个byteArray:255,216,255,224,从这里开始它们是相同的

第二个字节阵列:63,63,63,63 ......

当处理程序从db中检索时,字符串将转换为类似

的字节数组

更新

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 个答案:

答案 0 :(得分:12)

如果你想知道为什么会这样,这是因为ASCII编码不能处理128以上的字符。前四个字符转换为'?'。

由于字节数组中有图像,因此不应尝试将其转换为文本以便比较两个数组。为了比较,您应该遍历所有字节并打印它们的值。最好为此使用十六进制表示法。

答案 1 :(得分:4)

根据Wikipedia article,前四个字节是:

  • 0xFFD8图像开始
  • 0xFFEn特定于应用程序的标记

你的是0xFFE0,这是在图像开始后需要的APP0标记。请参阅www.w3.org/Graphics/JPEG/jfif3.pdf,标题为“用于识别JPEG FIF的APP0标记”一节。

答案 2 :(得分:1)

Writer类是一个文本编码流,通过它的声音,您使用的是StreamWriter,它是System.IO.TextWriter的一个实现。这是不正确的。您应该使用二进制流以本机格式写入数据。

希望这有助于为您提供所需方向的提示, 最好的祝福, 汤姆。

答案 3 :(得分:1)

未修改的SimpleWorkerRequest不适合接收二进制数据。让我引用MSDN(由我强调):

  

要实现更丰富的功能,例如提供发布的内容和标题以及捕获响应标头或响应正文作为二进制数据,您应该扩展SimpleWorkerRequest并覆盖相应的HttpWorkerRequest方法

答案 4 :(得分:0)

如果您的目标只是让它运行并且能够更改数据库方案,那么您可以使用以下帖子:http://blogs.msdn.com/domgreen/archive/2009/09/06/comparing-two-images-in-c.aspx

作者使用base64编码来比较现有图像,但您可以使用编码以相同的方式将图像存储在数据库中。

br,马塞尔