尽管成功,但使用AddRange抛出异常将Int32添加到List <byte>

时间:2018-06-04 23:25:32

标签: c# .net

我正在创建一个应用程序,它将从某个视频游戏的文件中以特定格式拍摄图像并将其转换为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. < / p>

奇怪的是,在编写幻数后,甚至将单个字节写入列表,例如ddsFile.Add((byte)0x00));导致同样的事情。

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

1 个答案:

答案 0 :(得分:2)

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

使用流和List<byte>而不是使用BinaryWriter并手动执行所有转换(尽管可能很麻烦),如果要缓冲,则流可以是内存流内存中的图像或文件流,如果你想立即将其写入磁盘。

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

这是一个简短的例子:

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()重载输出正确的字节。 (这个简短的例子省略了清理工作,但如果您使用文件流,则需要确保正确关闭它。)