Преобразование больших байтов в целое число?

#python #c# #endianness

#python #c# #порядковый номер

Вопрос:

У меня есть этот код python:

 f = open('file.bin', 'rb')
b = f.read(2)
bytes = b[0x0:0x2] //this is b'x10x24', for example
f.close()
a = int.from_bytes(bytes, 'big') //returns 4132
  

Кажется, я не могу понять, как добиться того же в C #.

Нашел ли этот метод:

 public static int IntFromBigEndianBytes(byte[] data, int startIndex = 0)
    {
      return (data[startIndex] << 24) | (data[startIndex   1] << 16) | (data[startIndex   2] << 8) | data[startIndex   3];
    }
  

Попытка этого метода всегда приводит к исключению IndexOutOfRangeException, потому что мои входные байты меньше 4. Понимание того, почему это происходит, или в противном случае любая информация будет оценена.

Ответ №1:

Игнорируя любую другую проблему. Есть много способов сделать это, по сути, вы спрашиваете, как взять массив байтов, который представляет 16-битное значение ( short , Int16 ) и присвоить его int

Учитывая

 public static int IntFromBigEndianBytes(byte[] data) 
    => (data[0] << 8) | data[1];

public static int IntFromBigEndianBytes2(byte[] data) 
    => BitConverter.ToInt16(data.Reverse().ToArray());
  

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

 var someArray = new byte[]{0x10, 0x24};

Console.WriteLine(IntFromBigEndianBytes(someArray));
Console.WriteLine(IntFromBigEndianBytes2(someArray));
  

Вывод

 4132
4132
  

Полная демонстрация здесь

Обратите внимание, что вы также должны использовать BitConverter.IsLittleEndian == false для определения порядкового номера вашей системы с помощью этих методов и изменить логику архитектуры с большим порядковым номером

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

1. Это здорово, спасибо. Однако, Convert.ToInt32(array.Hex()), 16); также сделал трюк, где .Hex() превращает байты в шестнадцатеричную строку.