这是从“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。 有什么帮助吗?
答案 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;
}
}