使这个C#SwapBytes代码x64兼容

时间:2010-06-07 12:03:42

标签: c# memory 64-bit

这是从“Endogine”引擎借来的一段代码。它应该交换任何字节数组的字节顺序:

unsafe protected void SwapBytes(byte* ptr, int nLength)
{
    for(long i = 0; i < nLength / 2; ++i) {
        byte t = *(ptr + i);
        *(ptr + i) = *(ptr + nLength - i - 1);
        *(ptr + nLength - i - 1) = t;
    }
}

当我瞄准x64架构时似乎失败了,但我无法理解为什么,因为没有指针被强制转换为int32。 有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

它似乎以什么方式失败?看起来很简单。我会用两个指针来加快它的速度:

unsafe protected void SwapBytes(byte* ptr, int nLength) {
  byte* ptr2 = ptr + nLength - 1;
  for(int i = 0; i < nLength / 2; i++) {
    byte t = *ptr;
    *ptr = *ptr2;
    *ptr2 = t;
    ptr++;
    ptr2--;
  }
}

但是,编译器非常擅长优化循环和数组访问。托管代码执行相同的操作可能非常接近不安全的代码:

protected void SwapBytes(byte[] data) {
  for(int i = 0, j = data.Length - 1; i < data.Length / 2; i++, j--) {
    byte t = data[i];
    data[i] = data[j];
    data[j] = t;
  }
}
相关问题