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 }
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
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.
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;
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;
}