c# - 将 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));
导致相同的结果。
任何帮助找出为什么会发生此异常和/或解决方案将不胜感激。
解决方案
这不是问题的答案,而是建议以不同的方式做。
不要使用 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()
您需要输出正确字节的任何重载。(这个简短的示例省略了清理工作,但如果您使用文件流,则需要确保正确关闭它。)
推荐阅读
- asp.net-mvc - 是否可以通过 API 在 Office 365 Outlook 中为用户设置电子邮件签名?
- python - 将存储的哈希密码与明文输入用户密码进行比较
- flutter - 如何在颤振中使用多个插件?
- laravel - 如何将登录用户从控件传递到 vuejs 组件?
- mysql - 将所有数据从一个数据库复制到另一个 MySQL - MariaDB
- python - 具有一列的 DataFrame,其值应每行增加 1
- powershell - 参考 PowerShell 7 中的 [Windows.Security.Credentials.PasswordCredential]
- command-line-interface - 如何连接到 Cloud Spanner 模拟器查看扳手 CLI?
- c# - 两台 PC 之间的 UDP 连接(请求的地址无效)
- java - 如何构建 .java 文件位于 WEB-INF/classes 中的 Maven Web 应用程序