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

От эти запись страницы urlopen документов, похоже, что просто необходимо поймать URLError. Если Вы действительно хотите застраховать свои ставки против проблем в коде urllib, можно также поймать Exception как нейтрализация. Сделайте не всего except:, так как это поймает SystemExit и KeyboardInterrupt также.

Редактирование: То, что я означаю говорить, Вы фиксируете ошибки, которые это, как предполагается, бросает. Если это бросает что-то еще, это происходит, вероятно, из-за кода urllib, не ловя что-то, что это должно было поймать и обернуть в URLError. Даже stdlib имеет тенденцию пропускать простые вещи как AttributeError. Ловля Exception, поскольку нейтрализация (и вход, что это поймало) помогут Вам выяснить то, что происходит, не захватывая SystemExit и KeyboardInterrupt.

8
задан RCIX 18 September 2009 в 04:23
поделиться

5 ответов

Укороченная версия (также сдвиг 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);
}
20
ответ дан 5 December 2019 в 04:30
поделиться

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

short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);
31
ответ дан 5 December 2019 в 04:30
поделиться

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

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;
}
4
ответ дан 5 December 2019 в 04:30
поделиться

Байт - это 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);
}

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

5
ответ дан 5 December 2019 в 04:30
поделиться

System.BitConverter

0
ответ дан 5 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

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