web-dev-qa-db-fra.com

c # comment ajouter un octet à un tableau d'octets

Comment ajouter un octet au début d'un tableau d'octets existant? Mon objectif est de créer un tableau de 3 octets de long à 4 octets. C'est pourquoi j'ai besoin d'ajouter 00 padding au début de celui-ci.

16
hs2d

Tu ne peux pas faire ça. Il n'est pas possible de redimensionner un tableau. Vous devez créer un nouveau tableau et y copier les données:

bArray = addByteToArray(bArray,  newByte);

code:

public byte[] addByteToArray(byte[] bArray, byte newByte)
{
    byte[] newArray = new byte[bArray.Length + 1];
    bArray.CopyTo(newArray, 1);
    newArray[0] = newByte;
    return newArray;
}
40
Guffa

Comme beaucoup de personnes ici l'ont souligné, les tableaux en C #, ainsi que dans la plupart des autres langages courants, ont une taille statique. Si vous cherchez quelque chose de plus semblable aux tableaux de PHP, ce que je vais vous deviner, puisqu'il s'agit d'un langage populaire avec des tableaux de taille dynamique (et dactylographiés!), Vous devriez utiliser un tableau de tableaux:

var mahByteArray = new ArrayList<byte>();

Si vous avez un tableau d'octets provenant d'ailleurs, vous pouvez utiliser la fonction AddRange.

mahByteArray.AddRange(mahOldByteArray);

Ensuite, vous pouvez utiliser Add () et Insert () pour ajouter des éléments.

mahByteArray.Add(0x00); // Adds 0x00 to the end.
mahByteArray.Insert(0, 0xCA) // Adds 0xCA to the beginning.

Besoin de revenir dans un tableau? .ToArray () vous a couvert!

mahOldByteArray = mahByteArray.ToArray();
15
Tyler Menezes

Les tableaux ne pouvant pas être redimensionnés, vous devez donc allouer un nouveau tableau plus grand, écrire le nouvel octet au début de celui-ci et utiliser Buffer.BlockCopy pour transférer le contenu de l'ancien tableau.

6
Jason Williams

Pour éviter de recopier le tableau à chaque fois, ce qui n'est pas efficace

Qu'en est-il de l'utilisation de Stack

csharp> var i = new Stack<byte>();
csharp> i.Push(1);
csharp> i.Push(2); 
csharp> i.Push(3); 
csharp> i; { 3, 2, 1 }

csharp> foreach(var x in i) {
  >       Console.WriteLine(x);
  >     }

3 2 1

5
James Kyburz

Bien qu’il crée en interne un nouveau tableau et y copie des valeurs, vous pouvez utiliser Array.Resize<byte>() pour obtenir du code plus lisible. Vous pouvez également envisager de vérifier la classe MemoryStream en fonction de vos objectifs.

3
C.Evenhuis

Simple, utilisez simplement le code ci-dessous, comme je le fais:

        public void AppendSpecifiedBytes(ref byte[] dst, byte[] src)
    {
        // Get the starting length of dst
        int i = dst.Length;
        // Resize dst so it can hold the bytes in src
        Array.Resize(ref dst, dst.Length + src.Length);
        // For each element in src
        for (int j = 0; j < src.Length; j++)
        {
            // Add the element to dst
            dst[i] = src[j];
            // Increment dst index
            i++;
        }
    }

    // Appends src byte to the dst array
    public void AppendSpecifiedByte(ref byte[] dst, byte src)
    {
        // Resize dst so that it can hold src
        Array.Resize(ref dst, dst.Length + 1);
        // Add src to dst
        dst[dst.Length - 1] = src;
    }
0