Преобразовать массив байтов в целое число В VB.Net
Вопрос
Мне интересно, какой наилучший способ преобразовать массив байтов (длина 4) в целое число находится в vb.net?Я знаю о BitConverter, но кажется довольно пустой тратой времени выполнять вызов функции, чтобы сделать что-то, что должно быть выполнено путем копирования 4 байт памяти.В том же духе, как насчет преобразования single / double из его двоичного представления в переменную single / double?
Решение
"Копирование байтов памяти" - это то, для чего .NET не особенно подходит (и VB.NET еще меньше подходит).Итак, если только переключение на C не является для вас вариантом, вызов функции для этого практически неизбежен.
BitConverter - это хорошо продуманная, протестированная функция.Конечно, вы можете избежать этого, сделав что-то вроде (в C #):
myInt = (*pbyte) | (*(pbyte + 1) << 8) | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);
(что, кстати, и есть, именно так что BitConverter делает для вас при преобразовании массива байтов в целое число ...).
Однако этот код:
- Это намного, намного сложнее для чтения и понимания, чем эквивалент BitConverter;
- Не выполняет никакой проверки ошибок, которую BitConverter выполняет для вас;
- Не проводит различий между младшими и старшими представлениями, как это делает BitConverter.
Другими словами:вы можете "сохранить" вызов функции, но в итоге вам будет значительно хуже (даже при условии, что вы не внесете никаких ошибок).В целом, .NET Framework очень, очень хорошо спроектирован, и вам не стоит дважды думать об использовании его функциональности, если только вы не столкнетесь с реальными проблемами (производительностью) при его использовании.
Другие советы
Я знаю о BitConverter, но это кажется довольно пустой тратой, чтобы сделать вызов функции, чтобы сделать то, что должно быть в состоянии сделать, скопировав 4 байт памяти.
В то время как я рассматриваю ситуацию как " пытаться вручную написать эффективный способ сделать это, если уже есть вызов метода, который делает именно то, что я хочу, "
Если вы не абсолютно уверены в том, что у вас есть узкое место в производительности в этом конкретном куске кода, используйте функциональность, предоставляемую платформой.
mdb в точности верен, но вот код для преобразования байтового массива vb в младшее целое число в любом случае ... (на всякий случай, если вы хотите написать свой собственный класс преобразователя битов)
'где bits () - ваш байтовый массив длины 4
Dim i as Integer
i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))
Вы можете заблокировать копирование байта [] в int [] с помощью класса System.Buffer.