c# -从已知偏移量的文件中获取字节

本文关键字:文件 获取 字节 偏移量 | 更新日期: 2023-09-27 18:03:18

作为一个小小的预先说明,这是我第一个合适的c#程序,我的编程经验主要是为TES5Edit编写Pascal脚本。我用拉撒路写了两个实际的程序,但是,呃,它们非常糟糕。

上传我当前代码:http://www.mediafire.com/download/fadr8bc8d6fv7cf/WindowsFormsApplication1.7z

不管怎样!我目前要做的是在。dds文件中获得两个特定偏移量的字节值。x分辨率保持@ offset +0c,由两个字节组成(所以+0c和+0d)。y分辨率也一样;@ offset +10 &+ 11。我把我的发现上传到这里:http://pastebin.com/isBKwaas

我不知道如何做到这一点,然而。我能从各种各样的谷歌搜索结果中破译的最多的结果是:

        public void GetDDSDimensions(string strDDSFilename, out int iSourceDDSx, out int iSourceDDSy)
    {
        FileStream fsSourceDDS = new FileStream(strDDSFilename, FileMode.Open, FileAccess.Read);
        int iWidthOffset = 12; // 0c in hex, if byte is 00, then size is => 256, so get +0d as well
        int iHeightOffset = 16; // 10 in hex, same gig as above. Get byte @ +11 if +10 is 00.
        byte[] bufferDDSBytes = new byte[24]; // @ Offset +24 , byte is always 01. Use as a wee, err, "landmark".
    }

不知道如何从那里继续前进。我需要以某种方式设置bufferDDSBytes以获取fsSourceDDS中的前24个字节,然后比较十六进制值@ +0c和+10,以获得.dds文件的分辨率。

比较应该很容易;c#应该有一个十六进制等效于Pascal的StrToInt()函数,不是吗?

c# -从已知偏移量的文件中获取字节

首先,使用using:-)

using (FileStream fsSourceDDS = new FileStream(strDDSFilename, FileMode.Open, FileAccess.Read))
{
     // do something with the FileStream
} // Ensures that it is properly closed/disposed

要转到流中的特定偏移,使用Seek方法:

fsSourceDDS.Seek(someOffset, SeekOrigin.Begin);

并在其上调用ReadByteRead方法以获得所需的尽可能多的字节。读取字节后,在流中的位置按读取的字节数前进。您可以使用Position属性获得流中的当前位置。要直接从流中读取小端值,可以使用BinaryReader类。

结合以上所有内容:

using (FileStream fsSourceDDS = new FileStream(strDDSFilename, FileMode.Open, FileAccess.Read))
using (BinaryReader binaryReader = new BinaryReader(fsSourceDDS))
{
    fsSourceDDS.Seek(0x0c, SeekOrigin.Begin);
    ushort with = binaryReader.ReadUInt16();
    fsSourceDDS.Seek(0x10, SeekOrigin.Begin);
    ushort height = binaryReader.ReadUInt16();
}