У меня проблема с маскированием Int16, C# интерпретирует высокое шестнадцатеричное число маски (65532d) как Int32. Я видел много примеров, но они либо UInt, либо используют дружественные солнечные маски с низким битом, которые не мешают знаковому биту, поэтому преобразование / приведение не требуется. Как мне заставить два числа ужиться? Посмотрите на FFF C ниже:
Код ошибки: Ошибка CS0266 Невозможно неявно преобразовать тип int в short. Существует явное преобразование (вам не хватает приведений?)
for (i = 0; i < nbrofsamples; i++) {
// bigbuffer[] contains a list of interlaced Int16 from up to 4 data channels
x = (i* SRecMeasPtrC.uNumCurves + SRecMeasPtrC.uCurveIndex) * sizeof(Int16);
intvalue = BitConverter.ToInt16(bigbuffer, x);
// intvalue's two lower bits are used for other stuff so I want to mask them away
intvalue = intvalue & 0xFFFC; // << ERROR! Meh! Hex masking works in C and in Delphi!
// and measvalue (a float) is calculated by applying a magic formula:
measvalue = Myvalue3(intvalue, CurrentKanalInfos[CurrentChannel], out iserr);
// and then I copy the float into an array (belonging to the channel) that can be plotted onscreen
Buffer.BlockCopy(BitConverter.GetBytes(measvalue), 0, Mymeasdata[CurrentChannel].curvebufferY, i * sizeof(Single), sizeof(Single));
}
Изменить: теперь я получил ссылки на пару ответов, в которых дается «почему», но нет «как». Один (часть) ответа: "Оператор & существует для int, а также существует неявное приведение от байта к int, поэтому, когда вы пишете byte1 и byte2, это фактически то же самое, что и запись ((int) byte1) & ((int) byte2), и результатом является int. " Один ответ, который был здесь в течение часа, дал мне -4 для использования вместо 0xFFF C, и я благодарен за этот обходной путь. Однако более удобная для чтения шестнадцатеричная маска «FFF C» все же должна быть в комментариях, а не в коде.
Вот что, наконец, не привело к ошибке, нужны все круглые скобки:
Int16 intvalue;
intvalue = (Int16)(((int)intvalue) & ((int)-4)) // -4 is my bitmask FFFC