Прежде всего в C # достаточно передать только массив в метод без его длины, поскольку класс Array
содержит свойство Length
.Таким образом, вы можете переписать свой метод следующим образом (unsafe
не требуется, так как вы не работаете с указателем в коде C #)
public static ushort ComputeChecksum(byte[] buffer)
{
ushort index;
ushort crc = 0;
for (int i = 0; i < buffer.Length; ++i) //using Length property
{
index = (ushort)((low ^ buffer[i]) & 0x00FF);
crc = (ushort)((high * 256) ^ table[index]);
}
return crc;
}
И есть несколько решений для вашей проблемы.Первый использует Linq
.Вы можете назвать свой метод следующим образом:
ushort crc = ComputeChecksum(arr.Skip(3).ToArray());
Чтобы использовать метод Skip
, вам необходимо добавить using System.Linq;
.
Второе решение использует Span
.Требуется Visual Studio 2017 (или 2015 с обновленным компилятором), как минимум .NET Framework 4.5 и добавление пакета System.Memory
с помощью диспетчера пакетов Nuget.
var span = new Span<byte>(arr, 3, arr.Length - 3);
ushort crc = ComputeChecksum(span.ToArray());
И самое простое решение - добавление offset
и length
помощники вашего метода
public static ushort ComputeChecksum(byte[] buffer, int length, int offset)
{
ushort index;
ushort crc = 0;
for (int i = offset; i < length; ++i)
{
index = (ushort)((low ^ buffer[i]) & 0x00FF);
crc = (ushort)((high * 256) ^ table[index]);
}
return crc;
}
и использования
int offset = 3;
ushort crc = ComputeChecksum(arr, arr.Length - offset, offset);