0

我的任务是(通过 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 文档并在此处阅读了一些类似的问题,但不知道他们是否回答了我的问题。

4

2 回答 2

0

你的问题是正确的。

0x08 是 8。

您不能简单地在文件中查找标志。

您需要找到详细说明文件格式定义的文档。

例如,“tar”(压缩文件格式)具有非常具体的信息,关于哪些标志在标头中的位置,以及如何解析 tar 文件。

于 2013-08-14T22:09:52.020 回答
0

如果这是您拥有如何查找嵌入图像数据的唯一信息,那么这将很难。以标志为前缀可能意味着很多事情。我可能指的是前导 0x8(1000 二进制)或 0xd(1100 二进制)字节,但它也可能是位掩码的一部分。

如果您没有任何其他关于它可能具有哪种标题作为前缀的信息,那么您可以尝试查找所有 0x8 或 0xd 字节,假设它表示图像数据的可能开始并提取图像然后检查如果它产生一个合理的图像。但是可能有很多。如果您知道文件中数据的大致位置,则可以缩小搜索范围。

显然,这要求您也知道实际的图像格式。如果你不这样做,那么除非它是某种形式的纯 RGB 位图左右,否则你几乎失去了。

于 2013-08-14T22:24:05.600 回答