【问题标题】:Adding Int32 to List<byte> using AddRange throwing exception despite being successful尽管成功,但使用 AddRange 将 Int32 添加到 List<byte> 会引发异常
【发布时间】:2018-06-04 23:25:32
【问题描述】:

我正在创建一个应用程序,该应用程序将从视频游戏的一个文件中获取特定格式的图像并将其转换为 DDS。这需要我在缓冲区中构建 DDS,然后将其写入 DDS 文件。此缓冲区的类型为List&lt;byte&gt;

我首先用这个代码写出幻数,也就是文本“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)); 结果相同。

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

【问题讨论】:

  • 为什么不使用MemoryStreamBinaryWriter?您的生活会轻松很多 - 他们会为您完成所有转换工作。
  • 我无法使用提供的代码进行复制,添加所有示例的范围编译并运行良好。你在哪里使用你的ddsFile 对象?
  • 您需要向我们展示您如何声明ddsFile
  • 我猜你是在发布模式下运行的,并且由于优化,行号被弄乱了。贴出完整代码!
  • 如果你能提供一个minimal reproducible example 这样我们就可以在最后重现这个问题了。

标签: c# .net


【解决方案1】:

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

不要使用List&lt;byte&gt; 并手动进行所有转换(当然可以,这很麻烦),而是使用流和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() 的任何重载。 (这个简短的示例省略了清理工作,但如果您使用文件流,则需要确保正确关闭它。)

【讨论】:

  • 我认为我使用 byte[] 读取原始(不是 DDS)文件这一事实使我倾向于使用 List 而不是 MemoryStream,我实际上已经忘记了直到现在 :p 实际上,尝试使用 List 工作是不值得的,所以我肯定会说这是 my 答案,即使不一定 答案。
  • @DisplayName 很高兴它有用。
  • @xxbcc 快速更新:简单地说,MemoryStream 产生了同样的问题,但我最终发现了它,并且很可能 List 也被 优化了 在项目配置中取消选中 Optimise Code 可以修复所有问题,因此即使我原来的 List 方法现在也可能有效,尽管我已经很长时间将其写出来并使用了 MemoryStream绝对更直观。
  • @DisplayName 您可能应该使用确切的代码发布一个关于该问题的新问题,因为这听起来像是一个需要调查的无关问题。我从未见过 MemoryStream 以这种方式表现,并且必须更改优化设置来修复某些东西是某处(可能在其他地方)存在错误的明确迹象。你的项目中有unsafe 代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多