首页 > 解决方案 > 将 Int32 添加到列表尽管成功,但使用 AddRange 抛出异常

问题描述

我正在创建一个应用程序,它将从一个视频游戏文件中获取某种格式的图像并将其转换为 DDS。这需要我在缓冲区中构建 DDS,然后将其写入 DDS 文件。此缓冲区的类型为List<byte>.

我首先使用以下代码编写幻数,即文本“DDS”:

ddsFile.AddRange(Encoding.ASCII.GetBytes("DDS "));

然后我需要编写标头大小,始终为 0x7C000000 (124),这就是我碰壁的地方。我使用此代码将其写入缓冲区:

ddsFile.AddRange(BitConverter.GetBytes(0x0000007C));

这对我来说很有意义,因为Encoding.ASCII.GetBytes()它自己说它返回 a byte[],并且它确实接受 aint作为参数,没问题。此外,这是我在寻找将多字节值添加到字节列表的方法时看到的推荐。但无论出于何种原因,当程序尝试执行该行时,就会抛出此异常:

无法将“System.Byte[]”类型的对象转换为“System.IConvertible”类型。

但更奇怪的是,当看到它进入缓冲区时,看到int实际上正在写入缓冲区,但异常仍然发生,谁知道是什么原因。

奇怪的是,即使在写入幻数之后将单个字节写入列表也会ddsFile.Add((byte)0x00));导致相同的结果。

任何帮助找出为什么会发生此异常和/或解决方案将不胜感激。

标签: c#.net

解决方案


这不是问题的答案,而是建议以不同的方式做。

不要使用 aList<byte>并手动进行所有转换(当然可以,这很麻烦),而是使用流和 a BinaryWriter- 如果您想在内存中缓冲图像,流可以是内存流,如果您想写入,则可以是文件流它立即到磁盘。

对流使用 aBinaryWriter可以使转换变得更加简单(如果需要,您仍然可以轻松地手动转换部分数据)。

这是一个简短的示例:

var ms = new MemoryStream();
var bw = new BinaryWriter(ms, Encoding.ASCII);

bw.Write("DDS ");
bw.Write(124); // writes 4 bytes
bw.Write((byte) 124); // writes 1 byte
...

使用Write()您需要输出正确字节的任何重载。(这个简短的示例省略了清理工作,但如果您使用文件流,则需要确保正确关闭它。)


推荐阅读