使这个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。 有什么帮助吗?
答
它以什么方式失败?它看起来很直截了当。我会用两个指针使它更快一点:
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;
}
}
您是否尝试过使用int类型为nLength和i?还有什么是你得到的错误? – Sijin 2010-06-07 12:13:24
如果您可以在x86和x64上运行特定的字节序列(例如,0x01,0x02,0x03,0x04),并显示结果不匹配,这将有所帮助。 – 2010-06-07 12:51:57