使此C#交换字节代码x64兼容

使此C#交换字节代码x64兼容,c#,memory,64-bit,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

下面是从“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;
    }
}
不安全保护的空交换字节(字节*ptr,整数长度)
{
用于(长i=0;i
当我以x64体系结构为目标时,它似乎失败了,但我不知道为什么,因为没有指向int32的指针。
有什么帮助吗?

它以什么方式失败?这似乎很直截了当。我会使用两个指针来加快速度:

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--;
  }
}
不安全保护的空交换字节(字节*ptr,整数长度){
字节*ptr2=ptr+nLength-1;
对于(int i=0;i
然而,编译器非常擅长优化循环和数组访问。执行相同操作的托管代码的性能很可能与不安全代码非常接近:

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;
  }
}
受保护的空交换字节(字节[]数据){
对于(inti=0,j=data.Length-1;i
您是否尝试将int类型同时用于nLength和i?还有,您得到的错误是什么?如果您可以在x86和x64上运行特定的字节序列(例如,0x01、0x02、0x03、0x04),并显示不匹配的结果,这将有所帮助。