10 votes

Convertir un tableau d'octets en int

J'essaie d'effectuer une conversion en C#, et je ne sais pas comment procéder :

private int byteArray2Int(byte[] bytes)
{
    // bytes = new byte[] {0x01, 0x03, 0x04};

    // how to convert this byte array to an int?

    return BitConverter.ToInt32(bytes, 0); // is this correct? 
    // because if I have a bytes = new byte [] {0x32} => I got an exception
}

private string byteArray2String(byte[] bytes)
{
   return System.Text.ASCIIEncoding.ASCII.GetString(bytes);

   // but then I got a problem that if a byte is 0x00, it show 0x20
}

Quelqu'un peut-il me donner des idées ?

26voto

Ben Voigt Points 151460

BitConverter est l'approche correcte.

Votre problème est que vous n'avez fourni que 8 bits alors que vous aviez promis 32. Essayez plutôt un nombre valide de 32 bits dans le tableau, tel que new byte[] { 0x32, 0, 0, 0 } .

Si vous voulez convertir un tableau de longueur arbitraire, vous pouvez l'implémenter vous-même :

ulong ConvertLittleEndian(byte[] array)
{
    int pos = 0;
    ulong result = 0;
    foreach (byte by in array) {
        result |= ((ulong)by) << pos;
        pos += 8;
    }
    return result;
}

Ce que la deuxième partie de votre question (impliquant des chaînes de caractères) est censée produire n'est pas clair, mais je suppose que vous voulez des chiffres hexadécimaux ? BitConverter peut aussi aider à cela, comme décrit dans une question précédente .

3voto

Barak Rosenfeld Points 297
byte[] bytes = { 0, 0, 0, 25 };

// If the system architecture is little-endian (that is, little end first), 
// reverse the byte array. 
if (BitConverter.IsLittleEndian)
  Array.Reverse(bytes);

int i = BitConverter.ToInt32(bytes, 0);
Console.WriteLine("int: {0}", i);

1voto

Mikant Points 502
  1. c'est correct, mais vous manquez, que Convert.ToInt32 veut" 32 bits (32/8 = 4 octets) d'informations pour effectuer une conversion, donc vous ne pouvez pas convertir juste un octet : `nouvel octet [] {0x32}

  2. absolument le même problème vous avez. et n'oubliez pas l'encodage que vous utilisez : d'un encodage à l'autre, vous avez "un nombre d'octets différent par symbole".

1voto

John Points 60

Une façon simple et rapide de procéder consiste à copier les octets dans un entier en utilisant Buffer.BlockCopy :

UInt32[] pos = new UInt32[1];
byte[] stack = ...
Buffer.BlockCopy(stack, 0, pos, 0, 4);

Cela présente l'avantage supplémentaire de pouvoir analyser de nombreux entiers dans un tableau en manipulant simplement les décalages

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