Хороший способ преобразования между коротким и байтовым - PullRequest
7 голосов
/ 18 сентября 2009

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

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);
}

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

Ответы [ 5 ]

31 голосов
/ 18 сентября 2009

Использование BitConverter

short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);
20 голосов
/ 18 сентября 2009

Укороченная версия (также смещение 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);
}
5 голосов
/ 18 сентября 2009

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

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);
}

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

4 голосов
/ 18 сентября 2009

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

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;
}
0 голосов
/ 18 сентября 2009

System.BitConverter

...