2009-06-01 5 views
0

Tenir compte de la méthode suivante (utilisée dans une méthode de fabrication):Comment puis-je extraire un sous-ensemble byte [] dans un code managé?

private Packet(byte[] rawBytes, int startIndex) 
{ 
    m_packetId = BitConverter.ToUInt32(rawBytes, startIndex); 
    m_dataLength = BitConverter.ToUInt16(rawBytes, startIndex + 4); 
    if (this.Type != PacketType.Data) 
     return; 
    m_bytes = new byte[m_dataLength]; 
    rawBytes.CopyTo(m_bytes, startIndex + Packet.HeaderSize); 
} 

Les deux dernières lignes de code me semblent inutiles. Allouer plus de mémoire et le peupler avec des valeurs de la mémoire semble ridicule.

Avec le code non managé, quelque chose comme cela est possible:

m_bytes = (rawBytes + (startIndex + Packet.HeaderSize)); 

(je ne l'ont pas fait par un compilateur si la syntaxe est probablement hors, mais vous pouvez le voir est juste une question de manipulation de pointeur.)

Je suis tombé sur un problème similaire l'autre jour où une API retourne un octet tableau [] qui était vraiment un tableau court [].

Est-ce que ces types de permutations de tableaux ne coûtent que le coût de l'utilisation du code managé ou existe-t-il une nouvelle école de pensée qui me manque?

Merci d'avance.

Répondre

2

Avez-vous considéré la restructuration de sorte que peut-être la copie n'est pas nécessaire?

Première option: stocker une référence à rawBytes dans m_bytes et de stocker le décalage qui doit être ajouté à tous les accès dans ce tableau d'octets.

Deuxième option: créer à la place m_bytes un MemoryStream à la place, construit à partir du tampon, d'un décalage et d'une longueur; ce constructeur ne copie pas le tampon d'octets et juste permet d'accéder au sous-segment spécifié. Gardez à l'esprit cependant que le prix d'éviter l'opération de copie est que les rawBytes et m_bytes (tableau ou flux) seront des alias, donc les changements à l'un vont changer l'autre aussi.

0

Oui, cela est plus coûteux en code managé mais rien ne vous empêche de faire cette méthode unsafe et de faire la manipulation de pointeur que vous souhaitez faire.

Questions connexes