나는 빠른 포인터를 사용하여 데이터의 블록을 XOR을 수행하는 코드를 가지고,하지만 난 어셈블리의 "안전하지 않은"요구 사항을 제거하고 싶습니다. 내가 변경하는 경우는 LayoutKind.Explicit을 사용하고 내가 포인터와 함께했던 같은 "ULONG []"는 "바이트 []"의 상단에, 나는 기본적으로하고있어 같은 일을 오버레이하지만, 그냥 위험한 것 같다. 이 두 가지의 주요 차이점은 "안전한"버전은 "안전하지 않은"버전의 1/2 속도입니다."안전하지 않은"포인터를 사용하여 주위를 돌아 다니려면 LayoutKind.Explicit를 사용하는 것이 합법적입니까?
이 "안전하지 않은"어셈블리를 갖는 이겨내는 합법적 인 방식으로 또는 동시에 안전한 방식으로이를 수행하는 방법을 합법적 바이트 [] 1 바이트 액세스인가?
private unsafe static void UnsafeEncode(
byte[] buffer, int bufPos, ulong[] vector, int SectionLength, byte vectorIndex)
{
fixed (byte* p = &buffer[bufPos])
{
ulong* pCur = (ulong*)p;
ulong* pEnd = pCur + SectionLength;
while (pCur < pEnd)
{
*pCur ^= vector[vectorIndex++];
pCur++;
}
}
}
[StructLayout(LayoutKind.Explicit)]
private struct ArrayOverlay
{
[FieldOffset(0)]
public byte[] Bytes;
[FieldOffset(0)]
public ulong[] Longs;
}
private static void SafeEncode(
byte[] buffer, int bufPos, ulong[] vector, int SectionLength, byte vectorIndex)
{
var overlay = new ArrayOverlay { Bytes = buffer };
int shiftleft = (bufPos & 7) << 3;
int pos = bufPos >> 3;
if (shiftleft == 0)
{
for (int i = 0; i < SectionLength; i++)
overlay.Longs[i + pos] ^= vector[vectorIndex++];
}
else
{
int shiftright = (64 - shiftleft) & 63;
ulong oldVec = 0;
for (int i = 0; i < SectionLength; i++)
{
var vec = vector[vectorIndex++];
overlay.Longs[i + pos] ^= (vec << shiftleft) | (oldVec >> shiftright);
oldVec = vec;
}
overlay.Longs[SectionLength + pos] ^= (oldVec >> shiftright);
}
}