4 votes

Conversion de tableaux d'octets en nombres entiers en VB.Net

Je me demande quelle est la meilleure façon de convertir un tableau d'octets (longueur 4) en un nombre entier en vb.net ? Je connais BitConverter, mais il me semble que c'est un gaspillage de faire un appel de fonction pour faire quelque chose qui devrait pouvoir être fait en copiant 4 octets de mémoire. Dans le même ordre d'idées, qu'en est-il de la conversion d'un simple/double de sa représentation binaire en une variable simple/double.

20voto

mdb Points 20629

La "copie d'octets de mémoire" est une activité pour laquelle .NET n'est pas particulièrement adapté (et VB.NET encore moins). Ainsi, à moins que le passage au C ne soit une option pour vous, un appel de fonction est pratiquement inévitable pour cela.

BitConverter est une fonction bien pensée et testée. Bien sûr, vous pouvez l'éviter en faisant quelque chose comme (en C#) :

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

(qui est, soit dit en passant, exactement ce que BitConverter fait pour vous lors de la conversion d'un tableau d'octets en un Integer...).

Cependant, ce code :

  • Est beaucoup, beaucoup plus difficile à lire et à comprendre que l'équivalent BitConverter ;
  • Il ne fait aucune des vérifications d'erreurs que BitConverter fait pour vous ;
  • Ne fait pas la différence entre les représentations little-endian et big-endian, comme le fait BitConverter.

En d'autres termes, vous pouvez "économiser" un appel de fonction, mais votre situation sera nettement moins bonne au final (même si vous n'introduisez pas de bogues). En général, le .NET Framework est très, très bien conçu, et vous ne devriez pas hésiter à utiliser ses fonctionnalités, à moins que vous ne rencontriez des problèmes réels (de performance).

8voto

Jon Skeet Points 692016

Je suis au courant de BitConverter, mais cela mais cela semble être un gaspillage de faire un fonction pour faire quelque chose qui devrait pouvoir être faite en copiant 4 octets de mémoire.

Alors que je vois la situation comme "c'est du gaspillage d'essayer de coder à la main un moyen efficace de faire ceci alors qu'il y a déjà un appel de méthode qui fait exactement ce que je veux".

A moins que vous ne soyez absolument convaincu que vous avez un goulot d'étranglement au niveau des performances dans ce morceau de code précis, utilisez la fonctionnalité fournie par le framework.

2voto

sbeskur Points 1194

Mdb a tout à fait raison, mais, voici un peu de code pour convertir un tableau d'octets vb en entier little endian de toute façon...(juste au cas où vous souhaitez écrire votre propre classe de convertisseur de bits)

' où bits() est votre tableau d'octets de longueur 4

Dim i as Integer 

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

1voto

Kennifer Points 836

Vous pouvez copier en bloc des byte[] vers des int[] en utilisant la classe System.Buffer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X