C # matriz de tipo de valor inseguro para conversiones de matriz de bytes

Utilizo un método de extensión para convertir matrices flotantes en matrices de bytes:

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

Entiendo que una matriz es un puntero a la memoria asociada con información sobre el tipo y la cantidad de elementos. Además, me parece que no hay forma de hacer una conversión desde y hacia una matriz de bytes sin copiar los datos como se indicó anteriormente.

¿He entendido esto? ¿Sería incluso imposible escribir IL para crear una matriz a partir de un puntero, tipo y longitud sin copiar datos?

EDITAR ¡Gracias por las respuestas, aprendí algunos fundamentos y pude probar nuevos trucos!

Después de aceptar inicialmente la respuesta de Davy Landman, descubrí que si bien su brillante truco StructLayout convierte los conjuntos de bytes en conjuntos flotantes, no funciona al revés. Demostrar

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

Parece que el CLR considera que ambas matrices tienen la misma longitud. Si la estructura se crea a partir de datos flotantes, la longitud de la matriz de bytes es demasiado corta.

Respuestas a la pregunta(7)

Su respuesta a la pregunta