La meilleure façon de trouver une position dans le Ruisseau où donné de la séquence d'octets commence
Comment pensez-vous quelle est la meilleure façon de trouver une position dans le Système.Ruisseau où donné de la séquence d'octets de chantier (première occurence):
public static long FindPosition(Stream stream, byte[] byteSequence)
{
long position = -1;
///???
return position;
}
P. S. le principe Le plus simple encore la solution la plus rapide est préférée. 🙂
votre question est source de confusion...ce que vous recherchez? cette séquence spécifique d'octets dans le flux?
Je pense que la question du titre devrait être mis à jour. Flux est mal orthographié sous la forme de Vapeur, qui donne l'impression d'une question qui doit être marqué de la Valve.
En fait, je suis venu à cette question juste pour résoudre ce problème.
En fait, je suis à la recherche pour le guid dans le ruisseau.
la mémoire est-elle un problème? ou pouvez-vous lire l'ensemble du flux de données en un tableau d'octets?
Je pense que la question du titre devrait être mis à jour. Flux est mal orthographié sous la forme de Vapeur, qui donne l'impression d'une question qui doit être marqué de la Valve.
En fait, je suis venu à cette question juste pour résoudre ce problème.
En fait, je suis à la recherche pour le guid dans le ruisseau.
la mémoire est-elle un problème? ou pouvez-vous lire l'ensemble du flux de données en un tableau d'octets?
OriginalL'auteur sh0gged | 2009-09-24
Vous devez vous connecter pour publier un commentaire.
J'en suis arrivé à cette solution.
J'ai fait quelques cas-tests avec un fichier ASCII qui a été
3.050 KB
et38803 lines
.Avec une recherche
byte
array
de22 bytes
dans la dernière ligne du fichier, j'ai obtenu le résultat dans environ2.28
secondes (dans un lent/vieille machine).PadLeftSequence
est à la recherche pour le premier non-appariement de l'octet qui a causéSequenceEqual
de fausse déclaration. Il semble comme un micro-optimisation pour moi, puisqu'on pourrait s'attendre àSequenceEqual
début retour sur un non-match de toute façon. Avertissement: j'ai pas fait de mesures, ce n'est qu'opinion.ne marche pas ne fonctionne que si la séquence est à l'index d'une longueur multipication? Je veux dire, 6 octets suivants à l'indice 4 ne sera pas trouvé ?
OriginalL'auteur bruno conde
Si vous traiter le flux comme une autre séquence d'octets, il vous suffit de le rechercher comme vous le faisiez une chaîne de recherche. Wikipedia a un excellent article sur le sujet. Boyer-Moore est une bonne et simple de l'algorithme pour cela.
Voici un petit hack j'ai mis en place en Java. Il fonctionne et qu'il est assez proche si ce n'Boyer-Moore. J'espère que ça aide 😉
Il semble
initBufferSize
variable dansfindBytes
n'est pas utilisé.OriginalL'auteur dharga
Vous aurez essentiellement besoin de garder un tampon de la même taille que
byteSequence
qu'une fois que vous avez trouvé que le "octet suivant" dans le flux des matchs, vous pouvez vérifier le reste, mais encore, puis revenir à la "prochaine, mais un" octet si c'est pas un match.Il est susceptible d'être un peu délicate, quoi que vous fassiez, pour être honnête 🙁
OriginalL'auteur
J'avais besoin de faire moi-même, avait déjà commencé, et n'aime pas les solutions ci-dessus. J'ai particulièrement besoin de trouver où la recherche-octet-fin de la séquence. Dans ma situation, j'ai besoin d'avancer rapidement dans le flux jusqu'au terme de cette séquence d'octets. Mais vous pouvez utiliser ma solution pour cette question aussi:
Ici est StreamExtensions.cs
OriginalL'auteur Todd
Peu vieille question, mais voici ma réponse. J'ai trouvé que la lecture de blocs et de la recherche qui est extrêmement inefficace par rapport à lecture seulement un à la fois et va à partir de là.
Aussi, autant que je me souvienne, la accepté de répondre serait un échec si une partie de la séquence a été dans un bloc de lire et l'autre moitié dans l'autre - ex, étant donné 12345, à la recherche de 23, il serait lire 12, pas de match, alors lisez 34, pas de match, etc... n'ai pas essayé, bien que, voyant qu'elle exige net 4.0. En tout cas, c'est plus simple, et probablement beaucoup plus rapide.
OriginalL'auteur ZigZagJoe