2010-01-13 2 views
2

J'ai des données dans un flux qui est réellement dans le format de uint. System.IO.Stream me permet seulement de lire le contenu sur un tableau d'octets, mais je ne veux pas lire les octets, puis les convertir en un tableau uint avec 1/4 de la longueur du tableau d'octets. Je veux le lire directement dans la mémoire du tableau uint afin de gagner du temps.Comment lire un flux géré dans un tableau uint directement en C#?

Si c'est en C++ non géré, c'est si simple. Envoyez simplement le pointeur vers le tableau uint et ce sera fait. Mais en C# cela ne semble pas si simple. J'essaie de produire un tableau d'octets avec la même adresse de mémoire qu'un autre tableau uint, puis d'envoyer le tableau d'octets en tant que paramètre de Stream.Read() de sorte que lorsque Stream.Read() écrit dans le tableau d'octets, le contenu est juste dans le tableau d'uint aussi bien. Mais j'ai regardé la classe Marshall et n'ai jusqu'à présent trouvé aucune solution à ce problème. Des idées?

Répondre

2

Je pense (oui, ceci est un autre de ces messages paresseux de type de suggestion dépourvu de code sur sa que les gens publient dans la tentative de gagner rep dans leurs 5 minutes de rechange), vous pouvez utiliser la même technique en C# en utilisant le mot-clé unsafe - cela vous permet de jouer avec des pointeurs et accéder à la mémoire en l'état. En fonction de vos données, bien sûr, je vous recommande de le faire de manière plus lente et inefficace - un code non sécurisé n'est pas vraiment joli - vous avez besoin de temps de sécurité supplémentaire pour tester.

+0

Je peux prendre l'adresse du tableau uint, mais la méthode Read() n'accepte aucun pointeur. Il accepte uniquement les tableaux d'octets gérés. Et je peux utiliser des pointeurs pour copier la mémoire du tableau d'octets dans la mémoire du tableau uint, mais ce n'est pas lire directement dans le tableau uint. Ce qui compte ici, c'est le temps. – neuron

+0

Il est toujours possible d'écrire votre implémentation dans C++ non géré et d'obtenir le résultat dans C# via P/Invoking. –

+0

Juste à la sortie: Qu'est-ce que c'est? Quelle est la taille de l'ensemble de données de toute façon? À quelle fréquence l'algorithme sera-t-il appelé? Est-ce que cela doit être interactif, ou est-ce un travail sur un serveur quelque part? –

3
List<UInt32> array = new List<UInt32>(); 
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream); 
while(stream.Position < stream.Length) 
    array.Add(reader.ReadUInt32()); 

Notez que certaines implémentations de flux ne prennent pas en charge les propriétés Position et/ou Longueur.

+0

En général correct mais à partir de l'OQ la longueur est connue à l'avance dans ce cas. –

+0

Si la solution directe ne pouvait vraiment pas être trouvée, alors cela pourrait être mon dernier recours. – neuron

Questions connexes