Хороший способ преобразования между короткими и байтами?

StackOverflow https://stackoverflow.com/questions/1442583

  •  22-07-2019
  •  | 
  •  

Вопрос

Мне нужно вводить пары байтов и выводить короткие значения, а также вводить короткие значения и выводить пары байтов.Вот функции, которые я разработал для этой цели:

static short ToShort(short byte1, short byte2)
{
    short number = (short)byte2;
    number <<= 4;
    number += (short)byte1;
    return number;
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte byte2 = (byte)(number >> 4);
    short tempByte = (short)byte2 << 4;
    byte byte1 = (byte)(number - tempByte);
}

Я думаю, что это правильно, но я не уверен.Если это неправильный способ сделать это, то что?есть ли способ сделать это уже в рамках?

Это было полезно?

Решение

Более короткая версия (также сдвигая 8 бит вместо 4):

static short ToShort(short byte1, short byte2)
{
    return (byte2 << 8) + byte1;
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte)(number >> 8);
    byte1 = (byte)(number & 255);
}

Другие советы

Используйте BitConverter

short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);

Байты 8 битов, а не 4, поэтому сдвиг отключен. Вы также объявили локальные переменные во второй функции, чтобы в итоге не записывать параметры out так, как вы намеревались. Также понятнее / лучше, если вы ограничиваете себя побитовыми операциями ( & amp; , | и ~ ), где это возможно.

static short ToShort(byte byte1, byte byte2)
{
    return (short) ((byte2 << 8) | (byte1 << 0));
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte) (number >> 8);
    byte1 = (byte) (number >> 0);
}

Обратите внимание, что сдвиги влево и вправо на ноль, строго говоря, не нужны. Я просто положил их для симметрии. Кроме того, лично я бы порекомендовал вам просто изучить побитовую арифметику холодных и пропустить написание вспомогательных функций, подобных этим. Не нужно скрывать детали с чем-то таким фундаментальным, ИМХО.

Если вы хотите брать байты ... берите байты; и ваши смены выключены, и | будет более интуитивно понятным:

static short ToShort(byte byte1, byte byte2)
{   // using Int32 because that is what all the operations return anyway...
    return (short)((((int)byte1) << 8) | (int)byte2);
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
    byte2 = (byte)number;
}

System.BitConverter

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top