web-dev-qa-db-fra.com

Comment convertir un tableau de flottants en octet [] et inversement?

J'ai un tableau de flottants qui doivent être convertis en tableau d'octets et retournés en flottant [] ... quelqu'un peut-il m'aider à le faire correctement?

Je travaille avec la classe bitConverter et je me suis retrouvé coincé à essayer d'ajouter les résultats.

La raison pour laquelle je fais cela est que je puisse enregistrer les valeurs d'exécution dans un flux IO. Le stockage cible est des blobs de page Azure au cas où cela importerait. Je me fiche de savoir de quel endian il s'agit. stocké dans, tant qu'il entrée correspond à la sortie.

static  byte[] ConvertFloatToByteArray(float[] floats)
        {
            byte[] ret = new byte[floats.Length * 4];// a single float is 4 bytes/32 bits

            for (int i = 0; i < floats.Length; i++)
            {
               // todo: stuck...I need to append the results to an offset of ret
                ret = BitConverter.GetBytes(floats[i]);

            }
            return ret;
        }


 static  float[] ConvertByteArrayToFloat(byte[] bytes)
{ //to do }
40
goodguys_activate

Si vous recherchez des performances, vous pouvez utiliser Buffer.BlockCopy . Agréable et simple, et probablement aussi rapide que vous obtiendrez en code managé.

var floatArray1 = new float[] { 123.45f, 123f, 45f, 1.2f, 34.5f };

// create a byte array and copy the floats into it...
var byteArray = new byte[floatArray1.Length * 4];
Buffer.BlockCopy(floatArray1, 0, byteArray, 0, byteArray.Length);

// create a second float array and copy the bytes into it...
var floatArray2 = new float[byteArray.Length / 4];
Buffer.BlockCopy(byteArray, 0, floatArray2, 0, byteArray.Length);

// do we have the same sequence of floats that we started with?
Console.WriteLine(floatArray1.SequenceEqual(floatArray2));    // True
74
LukeH

Vous ne déplacez pas la position lorsque vous copiez le float [i] dans le tableau d'octets, vous devez écrire quelque chose comme

Array.Copy(BitConverter.GetBytes(float[i]),0,res,i*4);

au lieu de simplement:

ret = BitConverter.GetBytes(floats[i]);

la fonction inverse suit la même stratégie.

5
Felice Pollano

Il y a la méthode BitConverter.ToSingle(byte[] value, int startIndex) qui devrait aider ici.

Renvoie un nombre à virgule flottante simple précision converti à partir de quatre octets à une position spécifiée dans un tableau d'octets.

Vous voulez probablement quelque chose comme (non testé):

static float[] ConvertByteArrayToFloat(byte[] bytes)
{
    if(bytes == null)
        throw new ArgumentNullException("bytes");

   if(bytes.Length % 4 != 0)
        throw new ArgumentException
              ("bytes does not represent a sequence of floats");

    return Enumerable.Range(0, bytes.Length / 4)
                     .Select(i => BitConverter.ToSingle(bytes, i * 4))
                     .ToArray();
}

[~ # ~] modifier [~ # ~] : Non-LINQ:

float[] floats = new float[bytes.Length / 4];

for (int i = 0; i < bytes.Length / 4; i++)
    floats[i] = BitConverter.ToSingle(bytes, i * 4);

return floats;
4
Ani
static float[] ConvertByteArrayToFloat(byte[] bytes)
{
    if(bytes.Length % 4 != 0) throw new ArgumentException();

    float[] floats = new float[bytes.Length/4];
    for(int i = 0; i < floats.Length; i++)
    {
        floats[i] = BitConverter.ToSingle(bytes, i*4);
    }

    return floats;
}
1
Lee