我正在通过TCP连续地从我的服务器向客户端发送许多图像。现在客户端,如何有效地检测到这是我的一个图像的结束所以将其写入文件系统然后下一个图像等等
祝你好运, ...
答案 0 :(得分:31)
嗯,不能保证你不会在jpeg图像中找到FFD9。找到jpeg图像结束的最佳方法是解析它。除了FFD0到FFD9和FF01(保留)之外,每个标记后面紧跟一个长度说明符,它将为您提供该标记段的长度,包括长度说明符,但不包括标记。 FF00不是标记,但出于您的目的,您可以将其视为标记而不使用长度说明符。
长度说明符是两个字节长,它是大端。所以你要做的就是搜索FF,如果后面的字节不是0x00,0x01或0xD0-0xD8之一,只要长度说明符减去两个字节,你就读取长度说明符并在流中向前跳过。
此外,每个标记都可以在开头填充任意数量的FF。
当你到达FFD9时,你就在流的最后。
当然,您可以逐字阅读流,如果您想要表现,则搜索FF,但这仍然是读者的练习。 ; - )
答案 1 :(得分:16)
快速查看Wikipedia's JPEG article会给你答案:
答案 2 :(得分:1)
如果您通过字节数组发送图像,则只需在文件开始之前将图像的文件大小添加为一对字节。
客户端抓取前两个字节以查找指定的字节数(我们将其称为x
)并丢弃它们,然后将下一个x
个字节数泵入一个可写入文件的缓冲区。
冲洗并重复以下所有jpeg。
另一种方法是寻找FFD9标记 - 如果我没有弄错任何压缩值FF将被编码为FF00(丢弃00字节并保留FF字节)。
这个问题是你得到的缩略图和自己的FFD9标题,但它们包含在标题的一个段中。这些段在其标记之后的两个字节中具有长度值,因此您可以跳到您遇到的任何段的末尾以避免过早的eoi检测。