我的任务是(通过C#)从已有20年历史的传统二进制文件中解析出一个图像;图像数据嵌入在二进制文件中,并以十六进制标志作为前缀。以下是我正在寻找的标志的定义(在C中):
#define C_THUMBNAIL 0x0008 /* thumbnail bitmap */
#define C_CTHUMBNAIL 0x000d /* compressed thumbnail bitmap */
如何在文件中找到其中一个标志(它们甚至是标志吗?)?如果我能弄清楚标志在哪里,以及如何读取标志后面的值(以字节为单位的图像大小),我就可以做我需要的事情。这就是我目前所拥有的:
var binReader = new BinaryReader(new FileStream(fileLocation, FileMode.Open));
//1. find flag
//2. get image size in bytes
//3. take the slice of the byte array containing the image
//4. write that slice of the array to a .png file.
我最初的想法是遍历二进制流,直到找到标志,但我真的很困惑,如果我的十六进制标志是数字8(0x0008==8,对吧?),我应该如何在文件中找到它,并将它与文件中的所有其他8区分开来。
如果这是一个重复的问题,很抱歉,但我对这个问题的了解不够,不知道该研究什么来解决它。我已经阅读了MSDN二进制文件文档,并在这里阅读了一些类似的问题,但不知道它们是否回答了我的问题。
您的问题是正确的。
0x08是8。
您不能简单地在文件中查找标志。
您需要找到一份详细说明如何定义文件格式的文档。
例如,"tar"(压缩文件格式)有关于哪些标志在标头中的位置以及如何解析tar文件的非常具体的信息。
如果这是您所掌握的如何找到嵌入图像数据的唯一信息,那么这将很困难。以旗帜为前缀可能意味着很多事情。我的意思可能是前导0x8(1000二进制)或0xd(1100二进制)字节,但它也可能是位掩码的一部分。
如果你没有任何其他信息,说明它可能有什么类型的头作为前缀,那么你可以尝试找到所有的0x8或0xd字节,假设它表示图像数据的可能开始,提取图像,然后检查它是否会产生一个合理的图像。然而,他们可能有很多。如果您知道文件中数据的大致位置,则可以缩小搜索范围。
显然,这需要您了解实际的图像格式。如果你不这样做,那么你就会损失惨重,除非它是某种形式的普通RGB位图