82 votes

Int à tableau d'octets

Je pensais que .net avait une sorte de méthode de conversion facile à utiliser pour convertir un int en un tableau d'octets? J'ai fait une recherche rapide et toutes les solutions sont un peu masquantes / décalées un octet à la fois, comme "the good ol days". N'y a-t-il pas une méthode ToByteArray () quelque part?

140voto

Marc Gravell Points 482669
byte[] bytes = BitConverter.GetBytes(i);

bien que remarque aussi que vous pourriez vouloir vérifier BitConverter.IsLittleEndian de voir dans quel sens autour de qui va apparaître!

Notez que si vous faites cela à plusieurs reprises , vous voudrez peut-être éviter tous ceux à court terme de la matrice de crédits alloués par l'écriture elle-même, soit par des opérations de déplacement (>> / <<), ou en utilisant unsafe code. Des opérations de déplacement aussi ont l'avantage qu'ils ne sont pas touchés par votre plate-forme de l'endianness; vous toujours obtenir les octets dans l'ordre où vous les attendez.

40voto

Chris Taylor Points 25865

La réponse de Marc est bien sûr la bonne réponse. Mais depuis, il a mentionné les opérateurs de décalage et le code unsafe comme une alternative. Je voudrais partager une commune de moins de rechange. À l'aide d'un struct avec Explicit mise en page. Ceci est similaire en principe à un C/C++ union.

Voici un exemple d'une structure qui peut être utilisé pour obtenir le composant octets du type de données Int32 et la bonne chose est qu'il est de deux, vous pouvez manipuler les valeurs d'octets et de voir l'effet sur l'Int.

  using System.Runtime.InteropServices;

  [StructLayout(LayoutKind.Explicit)]
  struct Int32Converter
  {
    [FieldOffset(0)] public int Value;
    [FieldOffset(0)] public byte Byte1;
    [FieldOffset(1)] public byte Byte2;
    [FieldOffset(2)] public byte Byte3;
    [FieldOffset(3)] public byte Byte4;

    public Int32Converter(int value)
    {
      Byte1 = Byte2 = Byte3 = Byte4 = 0;
      Value = value;
    }

    public static implicit operator Int32(Int32Converter value)
    {
      return value.Value;
    }

    public static implicit operator Int32Converter(int value)
    {
      return new Int32Converter(value);
    }
  }

Le ci-dessus peut maintenant être utilisé comme suit

 Int32Converter i32 = 256;
 Console.WriteLine(i32.Byte1);
 Console.WriteLine(i32.Byte2);
 Console.WriteLine(i32.Byte3);
 Console.WriteLine(i32.Byte4);

 i32.Byte2 = 2;
 Console.WriteLine(i32.Value);

Bien sûr, l'immutabilité de la police peut ne pas être excité à propos de la dernière possibilité :)

2voto

Steve Townsend Points 36948

Cela peut être OT mais si vous sérialisez de nombreux types primitifs ou structures POD, les tampons de protocole Google pour .Net peuvent vous être utiles. Ceci répond au problème d'endianisme soulevé ci-dessus par @Marc, parmi d'autres fonctionnalités utiles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X