2010-03-28 8 views
2

J'utilise BitConverter.ToInt32 pour emballer 3 byte valeurs dans un int, comme ceci:Alternative à BitConverter.ToInt32

byte R = 0; 
byte G = 0; 
byte B = 0; 
int i = BitConverter.ToInt32(new byte[] { R, G, B, 0 }, 0); 

est-il un moyen plus rapide de le faire qui ne concerne pas la création d'une nouvelle int chaque fois? Obtenir les octets sur un int est facile:

int i = 34234; 
byte B = (byte)(i >> 0); 
byte G = (byte)(i >> 8); 
byte R = (byte)(i >> 16); 

est-il un moyen simple d'inverser ce processus et l'utilisation peu de décalage pour écrire le RGB octets de retour sur une int existante?

+3

Pourquoi êtes-vous inquiet à propos de la création d'un nouvel 'int'? Créer un 'int' est gratuit. La partie concernée est la création d'un nouveau 'byte []' à chaque fois. – Gabe

+0

@gabe: ceci est juste un exemple de code. Dans le code réel, j'assignais à un tableau d'octets de niveau classe pré-instancié. Créer un int est virtuellement gratuit, mais pas si vous le faites pour des centaines de baies de 320 x 240. Le décalage de bits est significativement plus rapide que BitConverter.ToInt32. – MusiGenesis

+2

Vous êtes en train de convoquer RVB et BGR ici (les deux extraits de code ne font pas l'aller-retour). –

Répondre

8
int i = (B << 0) | (G << 8) | (R << 16); 
+0

Le décalage de 0 n'est pas vraiment nécessaire. – IVlad

+0

Le gagnant - mais je ne peux pas accepter pour encore 9 minutes. – MusiGenesis

+0

Aime l'avatar Lemmings, d'ailleurs. Je pense que je l'ai déjà mentionné. – MusiGenesis

4

Vous devriez considérer le Color structure. Il possède les propriétés R, G et B et les méthodes FromArgb() et ToArgb().

+3

Vous penseriez que 'Color' serait idéal pour cela, mais il est piggly lent. – MusiGenesis

+1

Difficile de voir comment cela pourrait être, il utilise des changements simples, et ou, tout comme le code normal. –

+0

Essayez-le par vous-même. – MusiGenesis