Хороший способ преобразования между короткими и байтами?
Вопрос
Мне нужно вводить пары байтов и выводить короткие значения, а также вводить короткие значения и выводить пары байтов.Вот функции, которые я разработал для этой цели:
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