Marshalling uma coleção de bytes big-endian em uma estrutura para extrair valores

Há uma pergunta perspicaz sobrelendo uma estrutura de dados C / C ++ em C # de uma matriz de bytes, mas não consigo que o código funcione para minha coleção de bytes big-endian (ordem de bytes da rede). (EDIT: Observe que minha estrutura real possui mais de um campo.) Existe uma maneira de organizar os bytes em uma versão big-endian da estrutura e extrair os valores na endianness da estrutura (a do host , que geralmente é little-endian)?

(Observe, reverter a matriz de bytesnão trabalho - os bytes de cada valor devem ser revertidos, o que não fornece a mesma coleção que a reversão de todos os bytes.)

Isso deve resumir o que estou procurando (LE = LittleEndian, BE = BigEndian):

void Main()
{
    var leBytes = new byte[] {1, 0, 2, 0};
    var beBytes = new byte[] {0, 1, 0, 2};
    Foo fooLe = ByteArrayToStructure<Foo>(leBytes);
    Foo fooBe = ByteArrayToStructureBigEndian<Foo>(beBytes);
    Assert.AreEqual(fooLe, fooBe);
}

[StructLayout(LayoutKind.Explicit, Size=4)]
public struct Foo  {
    [FieldOffset(0)] 
    public ushort firstUshort;
    [FieldOffset(2)] 
    public ushort secondUshort;
}

T ByteArrayToStructure<T>(byte[] bytes) where T: struct 
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(T));
    handle.Free();
    return stuff;
}

T ByteArrayToStructureBigEndian<T>(byte[] bytes) where T: struct 
{
    ???
}

Outros links úteis:

Byte de uma estrutura e para preocupações endian

Um pouco mais sobre bytes e endianness (ordem dos bytes)

Leia arquivos binários com mais eficiência usando C #

Inseguro e leitura de arquivos

A contribuição de Mono para a questão

Dominando estruturas C #

questionAnswers(8)

yourAnswerToTheQuestion