Чтение беззнакового 24-битного целого числа из потока C # - PullRequest
3 голосов
/ 24 августа 2010

Каков наилучший способ чтения беззнакового 24-разрядного целого числа из потока C # с помощью BinaryReader?

До сих пор я использовал что-то вроде этого:

private long ReadUInt24(this BinaryReader reader)
{
    try
    {
        return Math.Abs((reader.ReadByte() & 0xFF) * 256 * 256 + (reader.ReadByte() & 0xFF) * 256 + (reader.ReadByte() & 0xFF));
    }
    catch
    {
        return 0;
    }
}

Есть ли лучший способ сделать это?

Ответы [ 2 ]

10 голосов
/ 24 августа 2010

Некоторые споры с вашим кодом

  • Вы спрашиваете и подпись говорите без знака, но вы возвращаете значение со знаком из функции
  • Byte в .Net без знака, ноиспользование знаковых значений для арифметического принуждения для последующего использования Math.Abs.Используйте все расчеты без знака, чтобы избежать этого.
  • ИМХО чище сдвигать биты, используя операторы сдвига вместо умножения.
  • Молча ловить исключение, скорее всего, здесь неверная идея.

Я думаю, что более читабельно можно сделать следующее

private static uint ReadUInt24(this BinaryReader reader) {
    try {
        var b1 = reader.ReadByte();
        var b2 = reader.ReadByte();
        var b3 = reader.ReadByte();
        return 
            (((uint)b1) << 16) |
            (((uint)b2) << 8) |
            ((uint)b3);
    }
    catch {
        return 0u;
    }
}
1 голос
/ 24 августа 2010

Это выглядит довольно элегантно для меня.

private static long ReadUInt24(this BinaryReader reader)
{
  try
  {
    byte[] buffer = new byte[4];
    reader.Read(buffer, 0, 3);
    return (long)BitConverter.ToUInt32(buffer, 0);
  }
  catch 
  { 
    // Swallowing the exception here might not be a good idea, but that is a different topic.
    return 0;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...