Преобразование 3 байт в целое число со знаком в C#

#c# #bytearray #int #byte

#c# #массивы #int #байт

Вопрос:

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

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

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

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

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

Комментарии:

1. Знак и величина? Два дополняют друг друга?

2. Это дополнение two

Ответ №1:

В качестве последнего средства вы всегда можете shift add самостоятельно:

 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 amp; 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 .

Комментарии:

1. хорошо, спасибо за помощь. Мое окончательное решение немного отличается, но я также использую механизм проверки наиболее значимого бита (b1 amp; 0x80), чтобы определить, является ли число положительным или отрицательным.

2. @vc.one, да, спасибо за правку. Также необходимо () : (b1 << 16) ...

Ответ №2:

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

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

 var bytes = BitConverter.GetBytes(i);
int x = BitConverter.ToInt32(bytes, 0);
  

Ответ №3:

Чтобы добавить к существующим ответам здесь, есть небольшая ошибка, которая 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); .