> Where the extension character is shift+number of bytes (at least on my keyboard...) I'm a bit worried that it'll start
> looking like Perl, but time will tell.

Personally, I would go with something like:

  module B1 = struct
    let ( .%{ } ) = get_1byte_int
  end

  module B2 = struct
    let ( .%{ } ) = get_2byte_int
  end

  module B4 = struct
    let ( .%{ } ) = get_4byte_int
  end

  module B8 = struct
    let ( .%{ } ) = get_8byte_int
  end

Which gives you similar convenience:

  foo.B1.%{index}
  foo.B2.%{index}
  foo.B4.%{index}
  foo.B8.%{index}

without drifting into Perl territory.

Regards,

Leo