Преобразовать массив байтов в целое число в VB.Net - PullRequest
4 голосов
/ 22 октября 2008

Интересно, как лучше всего преобразовать байтовый массив (длина 4) в целое число в vb.net? Я знаю о BitConverter, но кажется довольно пустой тратой на вызов функции для выполнения чего-то, что должно быть выполнено путем копирования 4 байтов памяти. В том же духе, как насчет преобразования одинарного / двойного из его двоичного представления в единственную / двойную переменную.

Ответы [ 4 ]

20 голосов
/ 22 октября 2008

«Копирование байтов памяти» - это то, для чего .NET не особенно подходит (а VB.NET тем более). Таким образом, если переключение на C не является вариантом для вас, вызов функции для этого практически неизбежен.

BitConverter - продуманная, проверенная функция. Конечно, вы можете избежать этого, выполнив что-то вроде (в C #):

myInt = (*pbyte) | (*(pbyte + 1) << 8)  | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);

(что, кстати, точно , что BitConverter делает для вас при преобразовании байтового массива в целое число ...).

Однако, этот код:

  • Гораздо труднее читать и понимать, чем эквивалент BitConverter;
  • Не выполняет никакой проверки ошибок, которую BitConverter делает для вас;
  • Не делает различий между представлениями с прямым и прямым порядком байтов, как это делает BitConverter.

Другими словами: вы могли бы «сохранить» вызов функции, но в итоге вам будет значительно хуже (даже при условии, что вы не введете никаких ошибок). В целом, .NET Framework очень и очень хорошо спроектирован, и вам не следует дважды задумываться об использовании его функциональных возможностей, если только вы не столкнулись с реальными (производительными) проблемами с ним.

8 голосов
/ 22 октября 2008

Я знаю о BitConverter, но это кажется довольно пустой тратой, чтобы сделать вызов функции, чтобы сделать то, что должно быть в состоянии сделать, скопировав 4 байт памяти.

В то время как я рассматриваю ситуацию как «кажется бесполезной попыткой вручную написать эффективный способ сделать это, когда уже есть вызов метода, который делает именно то, что я хочу».

Если вы не абсолютно убеждены в том, что у вас есть узкое место в производительности в этом конкретном куске кода, используйте функциональность, предоставляемую платформой.

2 голосов
/ 22 октября 2008

mdb является абсолютно правильным, но вот код для преобразования байтового массива vb в младшее целое число в любом случае ... (на всякий случай, если вы хотите написать свой собственный класс преобразователя битов)

'где bits () - ваш байтовый массив длины 4

Dim i as Integer 

i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))
1 голос
/ 22 октября 2008

Вы можете заблокировать копирование байта [] в int [] с помощью класса System.Buffer.

...