2010-06-15 4 views
1

J'ai un tableau, je ne connais pas la longueur mais je sais que ce sera> = 48bytes. Les 48 premiers octets sont l'en-tête et j'ai besoin de diviser l'en-tête en deux.Array divisé par gamme?

Quel est le moyen le plus simple? J'espère quelque chose d'aussi simple que header.split (32); fonctionnerait ([0] est de 32 octets [1] étant de 16 tête en supposant est un tableau de 48bytes)

utilisant .NET

+0

quelle langue? C#? – Sev

+0

Oui. J'ai décidé d'écrire du code. je posterai. –

Répondre

0

j'ai décidé d'écrire quelque chose. Ca pourrait être plus joli comme une fonction étendue mais c'est bon maintenant.

Byte[][] SplitArray(byte[] main, params int[] size) 
    { 
     List<Byte[]> ls = new List<byte[]>(); 
     int offset = 0; 
     foreach (var v in size) 
     { 
      var b = new Byte[v]; 
      Array.Copy(main, offset, b, 0, v); 
      ls.Add(b); 
      offset += v; 
     } 
     { 
      var b = new Byte[main.Length-offset]; 
      Array.Copy(main, offset, b, 0, b.Length); 
      ls.Add(b); 
     } 
     return ls.ToArray(); 
    } 
+0

Nous savons que l'en-tête avancé va diviser deux moitiés, alors pourquoi ne pas utiliser un tableau 2D au lieu d'une liste –

+0

Dans ce cas, vous pouvez voir la fonction la diviser en fonction du nombre de paramètres de taille passés. Divisions 0-n. Même si je peux faire size.Length ou .Count je suis toujours paresseux et aime utiliser la liste. Aussi je n'ai pas d'index dans une boucle foreach qui pousse mon lazyness à utiliser add() –

3

Ici i fente tableau d'entiers en 2 rangées de 4 et les éléments de gauche:

var limit = 4; 

int[] array = new int[] { 1, 2, 3, 4, 5, 6 }; 

int[][] res = array.Select((value, index) => new { index = index, value = value }) 
        .GroupBy(i => i.index < limit) 
        .Select(g => g.Select(o => o.value).ToArray()) 
        .ToArray(); 

UPD: refaire avec une extension:

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] array = new int[] { 1, 2, 3, 4, 5, 6 }; 

     int[][] res = array.split(4); 
    } 
} 

static class MyExtension 
{ 
    public static int[][] split(this IEnumerable<int> array, int limit) 
    { 
     return array.Select((value, index) => new { index = index, value = value }) 
        .GroupBy(i => i.index < limit) 
        .Select(g => g.Select(o => o.value).ToArray()) 
        .ToArray(); 
    } 
} 
+0

Ressemble complexe. Encore, +1. –