C#在二进制文件中查找十六进制标志的位置

时间:2013-08-14 22:02:19

标签: c# binaryfiles

我的任务是解析(通过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,对吗?),我&# 39;我应该在文件中找到它并将其与文件中的所有其他8个区分开来。

很抱歉,如果这是一个重复的问题,但我不太了解这个问题,知道要研究什么来解决它。我已经阅读了有关二进制文件的MSDN文档,并在此处阅读了一些类似的问题,但无法判断他们是否回答了我的问题。

2 个答案:

答案 0 :(得分:0)

您的问题是正确的。

0x08是8。

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

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

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

答案 1 :(得分:0)

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

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

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