долго обсуждал сбои, к которым приведет этот взлом

ользую метод расширения для преобразования массивов с плавающей точкой в ​​байтовые массивы:

public static unsafe byte[] ToByteArray(this float[] floatArray, int count)
{
    int arrayLength = floatArray.Length > count ? count : floatArray.Length;
    byte[] byteArray = new byte[4 * arrayLength];
    fixed (float* floatPointer = floatArray)
    {
        fixed (byte* bytePointer = byteArray)
        {
            float* read = floatPointer;
            float* write = (float*)bytePointer;
            for (int i = 0; i < arrayLength; i++)
            {
                *write++ = *read++;
            }
        }
    }
    return byteArray;
}

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

Я понял это? Будет ли вообще невозможно написать IL для создания массива из указателя, типа и длины без копирования данных?

РЕДАКТИРОВАТЬ: Спасибо за ответы, я изучил некоторые основы и попробовал новые уловки!

Первоначально приняв ответ Дэви Лэндмена, я обнаружил, что, хотя его блестящий хак StructLayout конвертирует байтовые массивы в массивы с плавающей точкой, он не работает наоборот. Показывать:

[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]);

    // From floats to bytes - index out of range
    float[] floats = { 0.1f, 0.2f, 0.3f };
    arry = new UnionArray { Floats = floats };
    for (int i = 0; i < arry.Floats.Length * 4; i++)
        Console.WriteLine(arry.Bytes[i]);
}

Похоже, что CLR видит оба массива одинаковой длины. Если структура создается из данных с плавающей запятой, длина байтового массива слишком мала.

Ответы на вопрос(7)

Ваш ответ на вопрос