#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()
превращает байты в шестнадцатеричную строку.