2010-10-15 5 views
1

Existe-t-il un meilleur moyen d'écrire cela que d'utiliser BitConverter?C#: conversion manuelle des bits?

public static class ByteArrayExtensions 
{ 

    public static int IntFromUInt24(this byte[] bytes) 
    { 
     if (bytes == null) 
     { 
      throw new ArgumentNullException(); 
     } 

     if (bytes.Length != 3) 
     { 
      throw new ArgumentOutOfRangeException 
       ("bytes", "Must have length of three."); 
     } 

     return BitConverter.ToInt32 
        (new byte[] { bytes[0], bytes[1], bytes[2], 0 }, 0); 
    } 

} 
+0

Vous pouvez utiliser l'opérateur Bit Shift '<<' pour déplacer les valeurs des octets [0-2]. – davisoa

+0

http://stackoverflow.com/questions/3559183/reading-an-unsigned-24-bit-integer-from-ac-stream –

Répondre

3

J'utilise:

return bytes[2]<<16|bytes[1]<<8|bytes[0]; 

Soyez prudent avec boutisme: Ce code fonctionne uniquement avec little-endian 24 numéros de bits.

BitConverter d'autre part utilise l'endianness natif. Donc, vous ne pourriez pas travailler dans tous les systèmes big-endian.

+0

Bien que le décalage puisse être plus rapide (je ne sais pas), 'BitConverter' est plus lisible , alors ça dépend de quel aspect "meilleur" est focalisé. –

+1

Si c'était un nombre de 32 bits j'utiliserais probablement BitConverter aussi. Mais puisque les nombres de 24 bits exigent déjà le bidouillage, BitConverter n'est pas plus lisible IMO. – CodesInChaos

+0

Si BitConverter utilise l'endianness native, BitConverter ne fonctionnerait-il pas sur les machines big-endian et little-endian, alors que votre réponse ne fonctionnerait que sur les machines little-endian? – GoHeavyOrGoHome