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.
Réponses
Trop de publicités?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).
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.
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))