我只需要简单地检查dds文件的格式是否有效。我只需要对dds文件进行常规检查,因此不需要检查它是否是dxt 1、dxt 5、dx 10等。例如,如果我有一个png图像,我将扩展名重命名为。dds的dds格式当然会是错误的,然后我需要告诉用户,他试图使用一个格式错误的dds文件。然而,如果我有一个dds,确实有一个正确的文件格式,我将不需要做任何进一步的调查,因为我不关心什么类型的dds文件(此时)。所以我只需要读取dds文件中在所有dds文件中保持相同的部分。我“我想我可以用某种方式读取dds头和幻数。我必须对png文件做同样的验证,我阅读png头的方式如下:
var png = new byte[] { 0x89, 0x50, 0x4e, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }
using (FileStream fs = new FileStream(fileToCheck, FileMode.Open, FileAccess.Read))
{
if (fs.Length > buffer.Length)
{
fs.Read(buffer, 0, buffer.Length);
fs.Position = (int)fs.Length - endBuffer.Length;
fs.Read(bufferEnd, 0, endBuffer.Length);
}
fs.Close();
}
for (int i = 0; i < png.Length; i++)
{
if (buffer[i] != png[i])
return false;
}
return true;
我正在寻找是否有一个类似的方法来检查一个dds文件的格式。我是新的,我的问题是要知道什么字节的dds文件,将永远是相同的所有dds文件(这样我就可以检查这些字节,看看是否dds格式是有效的),以及我如何才能实现代码在一个简单的方式来检查dds格式。任何帮助将不胜感激。
编辑:所以感谢@NaCl我已经得到了问题的第一部分的答案。我现在知道在dds文件中哪些部分是必需的,但我不知道如何在dds文件中找到它。我用十六进制编辑器打开了很多dds文件,但我不太擅长逆向工程,所以我不能'我不知道我需要检查的字节在哪里,这将进一步使我不知道如何实现代码来搜索指定位置的字节(我可以用PNG文件来做,因为我找到了更多关于该文件的文档),因为我不知道该去哪个位置。
如果有人能给我指出正确的方向或以其他方式帮助我,我将不胜感激。谢谢。
1条答案
按热度按时间gab6jxml1#
对于有标题的文件,首先要做的是检查其幻数(如果文档中给出了幻数),对于DDS文件,幻数是
0x44445220
,它等于“纯文本”中的"DDS "
。之后,只需要处理规范,所有内容(除了幻数)都是以小端格式存储的,所以在处理字节时要小心,根据微软的说法,DDS头的definition是(C++):
基于此,我为任何“通用”DDS文件提供了以下代码:
上面的代码只是检查输入文件的前5个字节(作为参数
path
传递),这些字节与我看到的始终相同,应该等于:以上代码已使用此存储库中的
.dds
文件进行测试:https://github.com/toji/webgl-texture-utils/tree/master/sample/img,并且两个文件具有完全相同的标头:您可以优化上面的代码,以执行对大小为
ulong
的fs.Read
的单个调用,并根据此值检查整个过程:0x444453207C000000
.希望这有帮助:)