Вот моя оригинальная функция
private static Int32 getInt(byte[] Data, char Endianness)
{
if (Data.Length > 3)
{
switch (Endianness)
{
case 'l':
return ((Int32)(Data[3]) << 24) + ((Int32)(Data[2]) << 16) + ((Int32)(Data[1]) << 8) + (Int32)(Data[0]);
case 'b':
return ((Int32)(Data[0]) << 24) + ((Int32)(Data[1]) << 16) + ((Int32)(Data[2]) << 8) + (Int32)(Data[3]);
default:
throw new ArgumentException("Wrong endianness type", "Endianness types are 'l' or 'b'");
}
}
else
{
throw new ArgumentException("NVM data corruption", "Failed to parse NVM data");
}
}
Я использую Resharper, и он предложил удалить приведение к Int32, так как оно избыточно.
, поэтому мы получаем этот код в качестве вывода
private static int getInt(byte[] Data, char Endianness)
{
if (Data.Length > 3)
{
switch (Endianness)
{
case 'l':
return (Data[3] << 24) + (Data[2] << 16) + (Data[1] << 8) + Data[0];
case 'b':
return (Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + Data[3];
default:
throw new ArgumentException("Wrong endianness type", "Endianness types are 'l' or 'b'");
}
}
throw new ArgumentException("NVM data corruption", "Failed to parse NVM data");
}
в коде, который вы видите, я смещаю Data[2] << 16
, что число может переполниться из исходного байта, если я удалил приведение к Int32, рискну ли я здесь каким-то образом обрезать до байта?
Не могли бы вы объяснить, что здесь делает препроцессор / компилятор C #?
Спасибо