11
votes

Moyen le plus simple de copier INT vers l'octet []

J'ai un octet [] et je suis itération à travers une liste d'INT (et d'autres données) et je souhaite copier l'int vers mon byTearray [Index * 4] Comment puis-je faire cela?


0 commentaires

7 Réponses :


21
votes

bitconverter code> est tout à fait Peut-être votre ami.

Cependant, cela vous renvoie généralement un nouveau tableau em> octet. Cela ne vous permet pas également de spécifier l'endansion. J'ai le EndianbitConverter Code> Classe dans MISCUTIL qui a des méthodes pour convertir primitive Types en copiant les données directement dans une matrice d'octets existante. P>

Par exemple: P>

// Copy the bytes from the integer "value" into a byte array
// (buffer) starting at index 5
EndianBitConverter.Little.CopyBytes(value, buffer, 5);


2 commentaires

Wow, vous apprenez quelque chose de nouveau chaque jour :) Je ne savais même pas que cela existait!


D'accord, mieux que l'approche changeante, car vous n'avez pas besoin de penser à l'endian-ness. (À moins que, bien sûr, il a besoin de le changer).



9
votes

Faites-le comment le binarywriter le fait: xxx

(évidemment, cela copiera l'INT dans les 4 premiers octets du tableau)


0 commentaires

1
votes
byte[] bytes = new byte[listOfInts.Count * sizeof(int)];
int pos = 0;
foreach(int i in listOfInts)
{
    byte[] b = BitConverter.GetBytes(i);
    b.CopyTo(bytes, pos);
    pos += b.Length;
}

0 commentaires

1
votes

tampon.blockcopie (intarray, 0, byteArray, 0, 4 * intarray.length)

copie des données entre deux tableaux. Le dernier argument est la quantité de données à copier en octets.


0 commentaires

6
votes

Il existe de nombreuses façons différentes de le faire, mais de le rendre plus agréable, utilise une nouvelle fonctionnalité de C #: Extensions.

Un entier de la variété 32 bits prend 4 octets, de sorte qu'il occupera 4 taches dans l'octet []. Comment briser un entier dans ses 4 octets constitutifs? Vous pouvez le faire en utilisant l'opérateur de manipulation de bits >>. Cet opérateur déplace les bits dans l'entier par le nombre de bits spécifié. Par exemple: P>

int something = 20;
byte[] array = new byte[4];
something.CopyToByteArray(array,0);


0 commentaires

7
votes

Je vais essayer de résumer certaines des réponses précédentes pour faire quelque chose de nouveau

étape 1. strong> comme Jon Skeet dit avant: P>

BitConverter est probablement votre ami. p>

Cependant, cela vous renvoie généralement un nouveau réseau em> octet. p> blockQuote>

étape 2. strong> Vous pouvez trouver le code source de bitconverter.getbytes (int Value) (int> p> xxx pré>

Étape 3. Fort> Utilisation de l'imagination et modifier quelques lignes dans le code de l'étape 2 afin de pouvoir enregistrer les données à un tableau existant: P>

public static unsafe byte[] GetBytes(int value, int buffer[], int offset)
{
    // Here should be a range check. For example:
    // if (offset > buffer.Length + sizeof(int)) throw new IndexOutOfRangeException();

    fixed (byte* numPtr = &buffer[offset])
        *(int*) numPtr = value;
}


3 commentaires

Les étapes 2 et 3 ressemblent à son endian dépendante. Pouvez-vous confirmez s'il vous plaît?


Oui, les deux étapes sont endibiales.


Si nous utilisons des opérateurs de changement de bits, il peut s'agir de Code indépendant de l'Endian?



0
votes

Généralisation de la réponse exquise de l'adb: xxx


0 commentaires