【问题标题】:Alternative to BitConverter.ToInt32BitConverter.ToInt32 的替代品
【发布时间】:2026-02-22 22:10:01
【问题描述】:

我正在使用 BitConverter.ToInt32 将 3 个 byte 值打包到 int 中,如下所示:

byte R = 0;
byte G = 0;
byte B = 0;
int i = BitConverter.ToInt32(new byte[] { R, G, B, 0 }, 0);

有没有一种更快的方法来做到这一点,而不是每次都创建一个新的int?从int 中获取字节很容易:

int i = 34234;
byte B = (byte)(i >> 0);
byte G = (byte)(i >> 8);
byte R = (byte)(i >> 16);

有没有一种简单的方法来扭转这个过程并使用位移将 RGB 字节写回现有的int

【问题讨论】:

  • 你为什么担心创建一个新的int?创建int 是免费的。需要关注的部分是每次创建一个新的byte[]
  • @gabe:这只是示例代码。在实际代码中,我分配给一个预先实例化的类级字节数组。创建一个 int 实际上是免费的,但如果您要为数百个 320 x 240 数组执行此操作,则不是。位移速度明显快于 BitConverter.ToInt32。
  • 您在这里对 RGB 和 BGR 进行卷积(两个代码 sn-ps 不往返)。
  • 创建一个 int 并不是“实际上”免费的——它是完全免费的。 BitConverter 并不慢。将字节放入数组并进行 functino 调用是很慢的。
  • 我终于对这个做了一些基准测试:*.com/questions/4326125/… 看来BitConverter 的函数调用开销相当大。

标签: c# bit-manipulation bitconverter


【解决方案1】:
int i = (B << 0) | (G << 8) | (R << 16);

【讨论】:

  • 移动 0 并不是必须的。
  • 爱旅鼠头像,顺便说一句。我想我之前提到过。
  • @IVlad:但它使代码更易于阅读,而且免费。
  • 这会撤消显示的位移,它是 BGR(A) 格式。但它并不等同于使用 RGB(A) 格式的 BitConverter sn-p。
【解决方案2】:

你应该考虑Color structure。它具有 R、G 和 B 属性以及 FromArgb() 和 ToArgb() 方法。

【讨论】:

  • 你会认为Color 是这个的理想选择,但它非常慢。
  • 很难看出它是怎么回事,它使用简单的移位和和或,就像常规代码一样。
  • 我可以确认穆西的发现。 Color.FromRgb 甚至比 BitConverter 还要慢。