让我们假设以下CIL计划:
.assembly extern mscorlib {}
.assembly Program {}
.method private static void Main() cil managed
{
.entrypoint
.maxstack 4
.locals init ( int32[] a,
uint32 t )
// Creates an array of int of size 10
ldc.i4 10
newarr int32
stloc.0
// Writes 0xaabbccdd at the index 2 of the array
ldloc.0
ldc.i4.2
ldc.i4 0xaabbccdd
stelem.i4
// Loads
ldloc.0
ldc.i4 9 // <HERE>
ldelem.i1
stloc.1
ldstr "Value: 0x{0:x8}"
ldloc.1
box [mscorlib]System.UInt32
call void [mscorlib]System.Console::WriteLine(string, object)
ret
}
这个程序:
诀窍是我使用“ldelem.i1”而不是更标准的“idelem.i4”来解决性能问题(我想避免做掩码)这个想法是以一种方式访问数组的数据用C中的指针。
但事情并不是那么好,因为程序崩溃(IndexOutOfRangeException)索引超过10作为ldelem.i1的参数。 由于我无法在第三个索引的整数的前半部分之后访问数据,因此这种技巧无用。
理想情况下,我想访问索引39的字节,这对应于索引9处整数的最后一个字节。
如果有人对这一点有所了解,我将非常感激。