检测Eof是否有JPG图像

Zai*_*Zai 21 jpeg

我正在通过TCP连续地从我的服务器向客户端发送许多图像.现在在客户端,如何有效地检测到这是我的一个图像的结束,所以将其写入文件系统然后下一个图像,依此类推.

最好的祝福, ...

one*_*sse 33

好吧,不能保证你不会在jpeg图像中找到FFD9.找到jpeg图像结束的最佳方法是解析它.除了FFD0到FFD9和FF01(保留)之外,每个标记后面紧跟一个长度说明符,它将为您提供该标记段的长度,包括长度说明符,但不包括标记.FF00不是标记,但出于您的目的,您可以将其视为标记而不使用长度说明符.

长度说明符是两个字节长,它是大端.所以你要做的就是搜索FF,如果后面的字节不是0x00,0x01或0xD0-0xD8之一,只要长度说明符减去两个字节,你就读取长度说明符并在流中向前跳过.

此外,每个标记都可以在任何数量的FF的开头填充.

当你到达FFD9时,你就在流的最后.

当然,您可以逐字阅读流,如果您想要表现,则搜索FF,但这仍然是读者的练习.;-)

  • **摘要**:读取0xFF.读标记.读取长度说明符L并向前跳过L - 2个字节.在SOS(0xFFDA)段(后跟压缩数据)之后,跳转到第一个0xFF**而不是**,然后是0x00或0xD0-0xD8.从开始重复,直到遇到0xFFD9.适用于[此多扫描JPEG](http://hodapple.com/blag/assets/obscure_jpeg_features/20100713-0107-interleave.jpg). (5认同)
  • 这种方法容易受到损坏的图像(无论是意外删除的文件还是恶意设计的假图像) (3认同)
  • @Alex 好吧,关键是,您不能只是按顺序搜索 FFD9 并期望找到 jpeg 的结尾。我的方法与常规 jpeg 解码器没有什么不同,所以如果它容易受到攻击,那么每个 jpeg 解码器也是如此。当然,您应该知道您的缓冲区有多大并进行检查,以免您尝试在缓冲区之外进行读取。 (3认同)
  • 我应该澄清第一句话.很明显,FFD9位于图像的末尾.但是FFD9可能看起来嵌入在JPEG图像中而不是EOI标记.这就是你_have_解析JPEG以找到EOI标记的原因. (2认同)

dar*_*ioo 16

快速浏览维基百科的JPEG文章会给你答案:

  • 字节0xFF,0xD8表示图像的开始
  • 字节0xFF,0xD9表示图像结束

  • 重要的是要注意JPEG中可以嵌入JPEG(例如缩略图),因此您可能会看到SOI SOI EOI EOI标记.一定要考虑到这一点. (5认同)