【发布时间】:2018-06-04 23:25:32
【问题描述】:
我正在创建一个应用程序,该应用程序将从视频游戏的一个文件中获取特定格式的图像并将其转换为 DDS。这需要我在缓冲区中构建 DDS,然后将其写入 DDS 文件。此缓冲区的类型为List<byte>。
我首先用这个代码写出幻数,也就是文本“DDS”:
ddsFile.AddRange(Encoding.ASCII.GetBytes("DDS "));
然后我需要编写标头大小,始终为 0x7C000000 (124),这就是我碰壁的地方。我使用此代码将其写入缓冲区:
ddsFile.AddRange(BitConverter.GetBytes(0x0000007C));
这对我来说很有意义,因为 Encoding.ASCII.GetBytes() 说它自己返回一个 byte[],并且它确实接受一个 int 作为参数,没问题。此外,这是我在寻找将多字节值添加到字节列表的方法时看到的推荐。但无论出于何种原因,当程序尝试执行该行时,就会抛出此异常:
无法将“System.Byte[]”类型的对象转换为“System.IConvertible”类型。
但更奇怪的是,在看到 进入缓冲区后,我发现 int 实际上是 was being written to the buffer, but the exception was still occurring for who knows what reason.
奇怪的是,甚至在写入幻数之后将单个字节写入列表,例如ddsFile.Add((byte)0x00)); 结果相同。
任何帮助找出为什么会发生此异常和/或解决方案将不胜感激。
【问题讨论】:
-
为什么不使用
MemoryStream和BinaryWriter?您的生活会轻松很多 - 他们会为您完成所有转换工作。 -
我无法使用提供的代码进行复制,添加所有示例的范围编译并运行良好。你在哪里使用你的
ddsFile对象? -
您需要向我们展示您如何声明
ddsFile。 -
我猜你是在发布模式下运行的,并且由于优化,行号被弄乱了。贴出完整代码!
-
如果你能提供一个minimal reproducible example 这样我们就可以在最后重现这个问题了。