2

我正在研究一些代码,这些代码将 IL 字节数组解析为MethodBody.GetILAsByteArray.

假设我想从这样的 IL 字节流中读取元数据令牌或 32 位整数常量。起初我认为使用BitConverter.ToInt32(byteArray, offset)会使这变得容易。但是我现在担心这在大端机器上不起作用。

据我所知,IL 总是对多字节值使用 little-endian 编码:

“所有参数编号都被编码为最小地址的最低有效字节(一种通常称为“小端”的模式)。” 公共语言基础结构注释标准,第 III 部分,ch。1.2(第 482 页)。

由于BitConverter的转换方法尊重计算机体系结构的字节顺序(可以通过 发现BitConverter.IsLittleEndian),因此我得出结论,BitConverter不应使用它从 IL 字节流中提取多字节值,因为这会在大端机器上给出错误的结果。

这个结论正确吗?

  • 如果是:有没有办法告诉BitConverter转换使用哪种字节顺序,或者 BCL 中是否有任何其他类提供此功能,或者我是否必须编写自己的转换代码?

  • 如果不是:我哪里错了?Int32从 IL 字节数组中提取操作数值的正确方法是什么?

4

1 回答 1

1

在传递它之前,您应该始终在一个小端数组上执行此操作:

// Array is little. Are we on big?
if (!BitConverter.IsLittleEndian)
{
    // Then flip it
    Array.Reverse(array);
}
int val = BitConverter.ToInt32(...);

但是,正如您提到的 IL 流。字节码是这样的(AFAIK):

(OPCODE:(1|2):little) (VARIABLES:x:little)

所以我会读取一个字节,检查它的操作码,然后读取适当的字节并在必要时使用上面的代码翻转数组。我能问一下你在做什么吗?

于 2012-08-12T11:33:59.423 回答