Как преобразовать массив с плавающей точкой в ​​байт [] и обратно? - PullRequest
39 голосов
/ 08 января 2011

У меня есть массив с плавающей точкой, который необходимо преобразовать в байтовый массив и обратно в число с плавающей точкой [] ... Кто-нибудь может мне помочь сделать это правильно?

Я работаю с классом bitConverter и застрял, пытаясь добавить результаты.

Причина, по которой я это делаю, заключается в том, что я могу сохранить значения времени выполнения в IO Stream.Целевое хранилище - BLOB-объекты Azure Page на случай, если это имеет значение.Меня не волнует, в каком порядке они хранятся, если их входные данные совпадают с выходными.

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 }

Ответы [ 4 ]

70 голосов
/ 09 января 2011

Если вы ищете производительность, вы можете использовать Buffer.BlockCopy.Красиво и просто, и, вероятно, примерно так же быстро, как вы получите управляемый код.

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
5 голосов
/ 08 января 2011

Вы не перемещаете позицию, когда копируете float [i] в ​​байтовый массив, вы должны написать что-то вроде

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

вместо просто:

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

Обратные функции следуют той же стратегии.

4 голосов
/ 08 января 2011

Здесь должен помочь метод BitConverter.ToSingle(byte[] value, int startIndex).

Возвращает число с плавающей запятой одинарной точности, преобразованное из четырех байтов вуказанная позиция в байтовом массиве.

Вы, вероятно, хотите что-то вроде (не проверено):

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();
}

EDIT : 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;
1 голос
/ 08 января 2011
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;
}
...