Преобразовать массив байтов в целое число В VB.Net

StackOverflow https://stackoverflow.com/questions/227083

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне интересно, какой наилучший способ преобразовать массив байтов (длина 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top