Преобразование метода Java в C #: преобразование байтов в целые числа с помощью операторов сдвига битов

Я пытаюсь преобразовать следующие 2 метода в c # без компилятора .net. Откровенно говоря, я просто не понимаю, как эти два метода действительно работают за кулисами. Так что ответ и объяснение были бы здесь великолепны.

public static int bytesToInt(byte b0, byte b1, byte b2, byte b3)
{
        return (((int)b0 << 24) & 0xFF000000)
            | (((int)b1 << 16) & 0x00FF0000)
            | (((int)b2 << 8) & 0x0000FF00)
            | ((int)b3 & 0x000000FF);
}

public static byte[] charToBytes(char c)
{
    byte[] result = new byte[2];

    result[0] = (byte) ((c >>> 8) & 0x00FF);
    result[1] = (byte) ((c >>> 0) & 0x00FF);

    return result;
}

Второй метод особенно сбивает с толку из-за используемого оператора сдвига, который отличается от первого метода.

Заранее спасибо за любую помощь.

4 голоса | спросил TheDevOpsGuru 3 AM00000060000000631 2011, 06:26:06

2 ответа


0

">>>" является беззнаковым оператором смещения вправо в Java. Его можно заменить на «>>», что, однако, увеличивает значение знака, если оно отрицательное. В этом случае, однако, использование ">>" Оператор безвреден, так как результат сводится к одному байту в значении (& 0x00FF).

Маскировка, используемая в bytesToInt (& 0xFF000000 и т. д.), была необходима в Java, поскольку в Java байты являются знаковыми значениями, то есть , они могут быть положительными или отрицательными, и преобразование в int может расширить знак отрицательного значения. Однако в C # байты могут быть только положительными, поэтому маскирование не требуется. Таким образом, метод bytesToInt может быть переписан просто как:

return (((int)b0 << 24))    
  | (((int)b1 << 16))
  | (((int)b2 << 8))
  | ((int)b3);
ответил Peter O. 3 AM00000060000004931 2011, 06:44:49
0

Вы можете использовать BitConverter класс для преобразования между базовыми типами данных и байтовыми массивами.

Перезапись метода bytesToInt() будет выглядеть следующим образом:

public static int BytesToIntUsingBitConverter(byte b0, byte b1, byte b2, byte b3)
{
  var byteArray = BitConverter.IsLittleEndian ? new byte[] { b3, b2, b1, b0 } : new byte[] { b0, b1, b2, b3 };

  return BitConverter.ToInt32(byteArray, 0);
}

А переписывание метода charToBytes() будет выглядеть следующим образом:

public static byte[] CharToBytesUsingBitConverter(char c)
{
  byte[] byteArray = BitConverter.GetBytes(c);
  return BitConverter.IsLittleEndian ? new byte[] { byteArray[1], byteArray[0] } : byteArray;
}
ответил Eric Olsson 3 AM00000070000001031 2011, 07:09:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132