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?
Réponses
Trop de publicités?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.
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é :)
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.