今日は、byteなどを仮想streamとみなして、その一部をstructとしてアクセスする方法を説明する。しばらく悩んでいたのだが、id:akirameiさんの多大なる協力を得てこのたび完成した。 ・必要となる背景 例えば、メモリ上にzip headerをbyte[ ]として読み込むとする。この一部の範囲をあるstructとみなして、ZipHeader->CompressSizeのようにしてアクセスしたい。しかし、可能ならば、byte からstructへのまるごとコピーなどは発生して欲しくない。 ・解決法 1. GCHandle.Allocを使って、メモリをGCのcompactionの対象から外す。 2. Marshal.UnsafeAddrOfPinnedArrayElementで、pinningされたIntPtrを取得。 3. そのIntPtrをunsafe文脈で、castして使用する