Какой самый быстрый способ конвертировать byte [] в float [] и наоборот? - PullRequest
4 голосов
/ 01 августа 2011

Какой самый быстрый способ преобразовать байт [] в float [] и наоборот (без цикла, конечно).

Сейчас я использую BlockCopy, но тогда мне нужна двойная память.Я хотел бы получить какое-то приведение.

Мне нужно выполнить это преобразование просто для отправки данных через сокет и восстановления массива на другом конце.

Ответы [ 4 ]

7 голосов
/ 01 августа 2011

Конечно, предложение msarchet делает копии тоже.Вы говорите об изменении способа, которым .NET думает об области памяти, если вы не хотите копировать.

Но я не думаю, что то, что вы хотите, возможно, поскольку байты и числа с плавающей запятой представляются в памяти совершенно разными.Байт использует в памяти ровно байт, а число с плавающей запятой использует 4 байта (32 бита).

Если у вас нет требований к памяти для хранения данных, просто представьте данные как тип данных, который вы будете использовать.использовать больше всего памяти и преобразовывать значения, которые вы фактически используете, при их использовании.

Как вы хотите преобразовать число с плавающей запятой (которое может представлять значение между ± 1,5 × 10−45 и ± 3,4× 10 ^ 38) в байт (который может представлять значение от 0 до 255) в любом случае?

(см. Дополнительную информацию о:

Подробнее о плавающих типах в .NET здесь: http://csharpindepth.com/Articles/General/FloatingPoint.aspx

4 голосов
/ 02 августа 2011

Вы можете использовать StructLayout для достижения этой цели (из вопроса переполнения стека C # преобразование небезопасного массива типов значений в байтовые массивы ):

[StructLayout(LayoutKind.Explicit)]
struct UnionArray
{
    [FieldOffset(0)]
    public Byte[] Bytes;

    [FieldOffset(0)]
    public float[] Floats;
}

static void Main(string[] args)
{
    // From bytes to floats - works
    byte[] bytes = { 0, 1, 2, 4, 8, 16, 32, 64 };
    UnionArray arry = new UnionArray { Bytes = bytes };
    for (int i = 0; i < arry.Bytes.Length / 4; i++)
        Console.WriteLine(arry.Floats[i]);
}
0 голосов
/ 02 августа 2011
IEnumerable<float> ToFloats(byte[] bytes)
{
  for(int i = 0; i < bytes.Length; i+=4)
     yield return BitConverter.ToSingle(bytes, i);
}
0 голосов
/ 01 августа 2011

Два способа, если у вас есть доступ к LINQ :

var floatarray = ByteArry.AsEnumerable.Cast<float>().ToArray();

или просто используя функции массива

var floatarray = Array.ConvertAll(ByteArray, item => (float)item);
...