使这个C#SwapBytes代码x64兼容

问题描述:

这是从“Endogine”引擎借来的一段代码。它应该交换任何字节数组的字节顺序:使这个C#SwapBytes代码x64兼容

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。 有什么帮助吗?

+0

您是否尝试过使用int类型为nLength和i?还有什么是你得到的错误? – Sijin 2010-06-07 12:13:24

+0

如果您可以在x86和x64上运行特定的字节序列(例如,0x01,0x02,0x03,0x04),并显示结果不匹配,这将有所帮助。 – 2010-06-07 12:51:57

它以什么方式失败?它看起来很直截了当。我会用两个指针使它更快一点:

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; 
    } 
}