6
votes

C # remplacer les octets en octet []

Quelle est la meilleure façon de remplacer certains octets dans une matrice d'octet ??

Par exemple, j'ai bytesfromserver = écoute.receive (ref Groundep); et je peux faire bitconverter .TOSTRING (BYTESFROMSERVER) Pour le convertir en un format lisible pour renvoyer quelque chose sur les lignes de xxx

Je voudrais remplacer quelque chose à l'intérieur de cette fabrication "68 65 6c "à quelque chose comme" 68 00 00 "(tout comme exemple). Il n'y a pas .replace () sur un octet [].

Il y aurait un moyen facile de convertir cela dans un octet []?

Toute aide appréciée. Merci!


2 commentaires

Quelle sera la taille de la matrice d'octet dans votre code de production, c'est-à-dire. Exemple réel?


@Lasse V. Karlsen, environ 738 octets.


6 Réponses :


10
votes

Vous pouvez le programmer .... Essayez ceci pour un début ... Ceci n'est cependant pas robuste et non de la production comme du code ... Baware des erreurs hors-tête Je n'ai pas complètement testé cela ... xxx pré>

implémenter comme méthode d'extension p> xxx pré>

Utilisation Méthode normale: p>

bytesfromServer.Replace(
             new byte[] {0x75, 0x83 }, 
             new byte[]{ 0x68, 0x65, 0x6c});


7 commentaires

Je suppose que le 9 est où il commence à remplacer? Et tout si tout avant ce que vous voulez remplacer n'est pas statique? Par exemple, si je voulais modifier 0x61, 0x79, 0x65, 0x72, 0x73, 0x00, 0x30 à 0x61, 0x79, 0x65, 0x72, 0x73, 0x00, 0x39, 0x39


Oui, 9 est l'index de démarrage. Si l'index peut varier, vous devez effectuer une recherche, une boucle sur la chèque de la matrice si l'octet ou les octets correspondent à votre Criteia et utilisez-le comme étant à trois index ...


Donc, vous souhaitez remplacer dans un tableau d'octets un Searcharray spécifique avec un nouveau tableau où le tableau de recherche et la nouvelle matrice peuvent être si différentes .... Hmmm ...


En effet. Presque comme string.replace ("bonjour", "bonjour monde"); Mais pour un octet.


@RENE, cela renvoie la même valeur que j'ai mise ... octet [] helokitty = nouvel octet [] {0x57, 0x27, 0x00, 0x31, 0x36}; Replacebytes (Hellokitty, nouvel octet [] {0x57, 0x27, 0x00, 0x31, 0x36}, nouvel octet [] {0x57, 0x27, 0x00, 0x35, 0x30}); textbox1.text = bitconverter.tostring (helokitty); et si je fais Hellokitty = replacebytes, etc. il fait helokitty null.


@ E3PO Je l'ai débogé pour vous, j'ai mis à jour le code (dans la méthode de recherche que le tableau SRC est maintenant entièrement parcouru)


Les Entresbytes ('Bababanana »,' Babanana ') échoueront. Il correspondra correctement aux quatre premiers octets, puis échouez sur i = 4, réinitialisant Matchindex = 0. Puis il cherche Babanana à Banana et ne le trouve pas.



5
votes

Comment sur array.copy ?


0 commentaires

0
votes

Quelque chose que j'ai reconstitué ... va le tester bientôt. Crédits de Comment faire Vous convertissez la matrice d'octet en chaîne hexadécimale, et inversement?

     public byte[] ReplaceBytes(byte[] src, string replace, string replacewith)
    {
        string hex = BitConverter.ToString(src);
        hex = hex.Replace("-", "");
        hex = hex.Replace(replace, replacewith);
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }


2 commentaires

Il s'agit d'un peu de déchets à convertir d'un tableau d'octets à une chaîne et de retour au tableau d'octets ...


Cela pourrait correspondre à un motif hexadécimal sur deux octets 00-10-20 si vous avez effectué un remplacement pour 01, il entraînerait les deux premiers octets.



6
votes

Améliorer le code de René, j'ai créé une boucle tandis que pour remplacer toutes les occurrences: xxx

Cette méthode fonctionnera, mais si les octets source sont trop énormes, je préfère avoir un Fonction "fenêtres" pour traiter le morceau des octets par morceau. Sinon, cela prendra une énorme mémoire.


1 commentaires

Semble causer une boucle infinie si recherche est identique à repl . Ne me demandez pas comment j'ai trouvé ça ... :(



1
votes

Malheureusement, il y a des problèmes avec tous les messages (comme déjà signalé dans des commentaires). Il y a une réponse correcte dans Cette autre question

J'avais besoin d'une solution pour moi et a écrit le code suivant. Ceci est également plus flexible dans l'utilisation de termes énormes et multiples de recherche. xxx


1 commentaires

Cette question a été posée il y a longtemps et j'utilise une syntaxe C # plus moderne.



0
votes
    public static byte[] ReplaceBytes(byte[] src, byte[] search, byte[] repl)
    {
        if (repl == null) return src;
        int index = FindBytes(src, search);
        if (index < 0) return src;
        byte[] dst = new byte[src.Length - search.Length + repl.Length];
        Buffer.BlockCopy(src, 0, dst, 0, index);
        Buffer.BlockCopy(repl, 0, dst, index, repl.Length);
        Buffer.BlockCopy(src, index + search.Length, dst, index + repl.Length,src.Length - (index + search.Length));
        return dst;
    }

    public static int FindBytes(byte[] src, byte[] find)
    {
        if(src==null|| find==null|| src.Length==0|| find.Length == 0 || find.Length> src.Length) return -1;
        for (int i = 0; i < src.Length - find.Length +1 ; i++)
        {
            if (src[i] == find[0])
            {
               for(int m=1;m< find.Length;m++)
               {
                    if (src[i + m] != find[m]) break;
                    if (m == find.Length - 1) return i;
               }
            }
        }
        return -1;
    }
this may be a good method , i have test in lots of codes.

1 commentaires

Veuillez traduire ces commentaires en anglais ou supprimez-les.