【问题标题】:C# byte operations optimization: how to get dword from byte[] arrayC# 字节操作优化:如何从 byte[] 数组中获取 dword
【发布时间】:2017-05-11 12:53:42
【问题描述】:

是否可以一次操作从 byte[] 数组中获取 4 个字节?

这意味着代替:

var octet_a = bytes[i++];
var octet_b = bytes[i++];
var octet_c = bytes[i++];
var octet_d = bytes[i++];

得到类似的东西

Int32 b4= Get4Bytes(i);
i=i+4;

【问题讨论】:

  • 你需要做一次,还是在缓冲区的多个位置重复做?
  • 您可以使用unsafe 代码实现此目的。
  • 我需要它。但是有后退的步骤。所以“一次”更好地描述了它:)

标签: c# .net micro-optimization


【解决方案1】:

您可以使用 BitConverter。因为它实际上使用不安全的方法将字节数组转换为数字。

var dword = BitConverter.ToInt32(bytes, i);

这将在第一次执行时通过抖动进行优化。如果您自己尝试类似的方法,您将不会获得更好的性能。

【讨论】:

    【解决方案2】:

    如前所述,您可以使用BitConverter,它肯定会比您做得更好,但如果您仍然想知道它是如何完成的:

    public unsafe int Get4Bytes(byte[] bytes, int index)
    {
        fixed (byte* b = &bytes[index])
        {
            var v = (int*)b;
            return *v;
        }
    }
    

    首先,我们使用fixed 获得一个指向索引字节b 的指针。由于 C# 是一种托管语言,因此运行时可以随时移动内存。我们使用fixed 告诉运行时在我们对内存执行不安全操作时不要移动bytes

    一旦固定,b 当前是 byte*(指向字节的指针),但您需要 4 个字节,因此我们将其转换为 int*(指向 int 的指针)。请注意,它仍然是相同的值。然后我们取消引用指针以获取实际的整数值。 (*v)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 2013-04-11
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多