C# Маскирование подписанного int шестнадцатеричной маской, которая «выглядит как» UInt - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема с маскированием 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
...