for (var i = 0; i < (len / 8) + 1; i++)
Отладчику в целом сложно с этим объединением, он не может отображать содержимое массива, когда я его пробую.Но основной проблемой, без сомнения, является +1 в выражении for () end.Это индексирует массив после его последнего элемента, когда len делится на 8. Среда выполнения не может отловить эту ошибку, перекрытие массивов приводит к тому, что свойство Length имеет поддельное значение.Далее происходит неопределенное поведение, вы читаете байты, которые не являются частью массива.Обходной путь - сделать массив на 7 байт длиннее.
Этот код не совсем оптимизация, чтение и сравнение uint64 на 32-битной машине стоит дорого, особенно если массив не выровнен правильно.Около 50% шансов на это.Лучшей мышеловкой является использование функции C memcmp () среды выполнения C, доступной на любом компьютере с Windows:
[DllImport("msvcrt.dll")]
private static extern int memcmp(byte[] arr1, byte[] arr2, int cnt);
И используйте ее следующим образом:
int len;
while ((len = target.Read(arr1, 0, 4096)) != 0) {
if (compareTo.Read(arr2, 0, 4096) != len) return false;
if (memcmp(arr1, arr2, len) != 0) return false;
}
return true;
Сравните эту функциюс простым циклом for (), который сравнивает байты.В конечном итоге дроссельной заслонкой является пропускная способность шины памяти.