Преобразование 3 байтов в целое число со знаком в C # - PullRequest
5 голосов
/ 12 ноября 2011

Я пытаюсь преобразовать 3 байта в целое число со знаком (Big-endian) в C #.

Я пытался использовать метод BitConverter.ToInt32, но моя проблема в том, какое значение должно иметь байт lats.

Кто-нибудь может подсказать мне, как я могу сделать это по-другому?

Мне также нужно преобразовать 5 (или 6 или 7) байтов в длину со знаком, есть ли общее правило, как это сделать?

Заранее спасибо за любую помощь.

Ответы [ 3 ]

9 голосов
/ 12 ноября 2011

В крайнем случае вы всегда можете измениться + добавить себя:

byte b1, b2, b3;

int r = b1 << 16 | b2 << 8 | b3;

Просто меняйте местами b1 / b2 / b3, пока не получите желаемый результат.

Если подумать, это никогда не приведет к отрицательным значениям.
Какой результат вы хотите, когда MSB> = 0x80?


Часть 2, расширение знака грубой силы:

    private static int Bytes2Int(byte b1, byte b2, byte b3)
    {
        int r = 0;
        byte b0 = 0xff;

        if ((b1 & 0x80) != 0) r |= b0 << 24;
        r |= b1 << 16;
        r |= b2 << 8;
        r |= b3;
        return r;
    }

Я проверял это с:

      byte[] bytes = BitConverter.GetBytes(p);
      int r = Bytes2Int(bytes[2], bytes[1], bytes[0]);
      Console.WriteLine("{0} == {1}", p, r);

для нескольких p.

4 голосов
/ 12 ноября 2011

Последнее значение должно быть 0, если оно не установлено для положительного числа, 256 для отрицательного.

Чтобы узнать, что вы должны передать, вы можете попробовать преобразовать его другим способом:

var bytes = BitConverter.GetBytes(i);
int x = BitConverter.ToInt32(bytes, 0);
0 голосов
/ 13 декабря 2017

Чтобы добавить здесь к существующим ответам, есть небольшая хитрость в том, что Bitconverter.ToInt32() выбросит ArgumentException, если размер массива меньше sizseof(int) (4) байтов;

Массив назначения недостаточно длинный, чтобы скопировать все элементы в коллекции.Проверьте индекс и длину массива.

При наличии массива размером менее sizeof(int) (4) байта вы можете компенсировать заполнение влево / вправо следующим образом;

Правая клавиша

Результаты в положительном Int32 числах

int intByteSize = sizeof(int);
byte[] padded = new byte[intByteSize];
Array.Copy(sourceBytes, 0, padded, 0, sourceBytes.Length);
sourceBytes = padded;

Левая панель

Результаты в отрицательных Int32 числах, предполагая ненулевое значение в байтовом индексе sourceBytes.Length - 1.

int intByteSize = sizeof(int);
byte[] padded = new byte[intByteSize];
Array.Copy(sourceBytes, 0, padded, intByteSize - sourceBytes.Length, sourceBytes.Length);
sourceBytes = padded;

После заполнения вы можете безопасно позвонить int myValue = BitConverter.ToInt32(sourceBytes, 0);.

...