Pregunta

Me pregunto cuál es la mejor forma de convertir una matriz de bytes (longitud 4) en un entero en vb.net. Soy consciente de BitConverter, pero parece un desperdicio hacer una llamada a una función para hacer algo que debería poder hacer copiando 4 bytes de memoria. En la misma línea, ¿qué pasa con la conversión de un solo / doble de su representación binaria a una sola / doble variable?

¿Fue útil?

Solución

" Copiando bytes de memoria " es algo para lo que .NET no es particularmente adecuado (y VB.NET aún menos). Por lo tanto, a menos que el cambio a C sea una opción para usted, una llamada de función es bastante inevitable para esto.

BitConverter es una función bien pensada y probada. Por supuesto, puede evitarlo haciendo algo como (en C #):

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

(que es, por cierto, exactamente lo que BitConverter hace por usted al convertir una matriz de bytes en un entero ...).

Sin embargo, este código:

  • Es mucho, mucho más difícil de leer y entender que el equivalente de BitConverter;
  • No realiza ninguna de las comprobaciones de error que BitConverter hace por usted;
  • No distingue entre las representaciones little-endian y big-endian, como lo hace BitConverter.

En otras palabras: puede " guardar " una llamada a la función, pero estará mucho peor al final (incluso suponiendo que no presente ningún error). En general, .NET Framework está muy, muy bien diseñado, y no debería pensar dos veces en usar su funcionalidad, a menos que tenga problemas reales (de rendimiento).

Otros consejos

  

Soy consciente de BitConverter, pero   Parece un desperdicio hacer un   función llamada para hacer algo que   Se debe poder hacer copiando 4.   bytes de memoria.

Mientras veo la situación como "parece un desperdicio tratar de codificar manualmente una forma eficiente de hacerlo cuando ya hay un método que hace exactamente lo que quiero".

A menos que esté absolutamente convencido de que tiene un cuello de botella en el rendimiento de esta pieza exacta de código, use la funcionalidad proporcionada por el marco.

mdb es exactamente correcto, pero aquí hay un código para convertir una matriz de bytes vb a little endian integer de todos modos ... (en caso de que desee escribir su propia clase de bitconverter)

'donde bits () es su matriz de bytes de longitud 4

Dim i as Integer 

i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))

Puede bloquear el byte de copia [] a int [] usando la clase System.Buffer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top