Как преобразовать массив поплавков в байт [] и обратно?
У меня есть массив Floats, который нужно преобразовать в массив байтов и вернуться к float []... может ли кто-нибудь помочь мне сделать это правильно?
Я работаю с классом bitConverter и обнаружил, что пытаюсь добавить результаты.
Причина, по которой я делаю это, - это то, что я могу сохранить значения времени выполнения в потоке ввода-вывода. Целевое хранилище - это бляшки Azure Pages в случае, если это имеет значение. Меня не волнует, какой endian это хранится, пока он вводит результат вывода.
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 }
Ответы
Ответ 1
Если вы ищете производительность, вы можете использовать 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
Ответ 2
Вы не перемещаете позицию при копировании float [i] в массив байтов, вы должны написать что-то вроде
Array.Copy(BitConverter.GetBytes(float[i]),0,res,i*4);
вместо просто:
ret = BitConverter.GetBytes(floats[i]);
обратная функция следует той же стратегии.
Ответ 3
Здесь BitConverter.ToSingle(byte[] value, int startIndex)
, который должен помочь здесь.
Возвращает одноточечный плавающий номер точки, преобразованный из четырех байтов в заданной позиции в байте массив.
Вероятно, вы хотите что-то вроде (untested):
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: не-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
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;
}