Dlaczego nie używać BitConvertera? Muszę uwierzyć, że Microsoft spędził jakiś czas na dostrojeniu tego kodu. Plus zajmuje się problemami endian.
Oto jak BitConverter okazuje byte [] do długiej/ulong (Ulong konwertuje go jako podpisany, a następnie rzuca go do unsigned):
[SecuritySafeCritical]
public static unsafe long ToInt64(byte[] value, int startIndex)
{
if (value == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
}
if (((ulong) startIndex) >= value.Length)
{
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
}
if (startIndex > (value.Length - 8))
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
}
fixed (byte* numRef = &(value[startIndex]))
{
if ((startIndex % 8) == 0)
{
return *(((long*) numRef));
}
if (IsLittleEndian)
{
int num = ((numRef[0] | (numRef[1] << 8)) | (numRef[2] << 0x10)) | (numRef[3] << 0x18);
int num2 = ((numRef[4] | (numRef[5] << 8)) | (numRef[6] << 0x10)) | (numRef[7] << 0x18);
return (((long) ((ulong) num)) | (num2 << 0x20));
}
int num3 = (((numRef[0] << 0x18) | (numRef[1] << 0x10)) | (numRef[2] << 8)) | numRef[3];
int num4 = (((numRef[4] << 0x18) | (numRef[5] << 0x10)) | (numRef[6] << 8)) | numRef[7];
return (((long) ((ulong) num4)) | (num3 << 0x20));
}
}
Podejrzewam, że robi konwersję jednego 32-bitowego słowa w Czas jest na wydajność 32-bitową. Brak rejestrów 64-bitowych na 32-bitowym procesorze oznacza, że obsługa 64-bitowych int jest o wiele droższa.
Jeśli wiesz na pewno, że kierujesz się na sprzęt 64-bitowy, szybsza może być konwersja za jednym zamachem.
Wygląda BitConverter.ToInt64 - http://msdn.microsoft.com/en-us/library/system.bitconverter.toint64.aspx? –
Odczytywanie i przesuwanie kilku bajtów - czy to uczciwie drogie? Jestem pewien, że nazywasz to dużo, ale byłbym zaskoczony, gdyby kompilator mógł się pomylić z tym – Rup
@Alexei ToUInt64, ale tak. Jeśli zamiast tego chciałeś użyć tego, opublikuj to jako odpowiedź? (Czy Eric chce zoptymalizować BitConverter?) – Rup