【发布时间】:2012-08-12 11:30:34
【问题描述】:
我正在编写一些代码来解析MethodBody.GetILAsByteArray 返回的 IL 字节数组。
假设我想从这样的 IL 字节流中读取元数据令牌或 32 位整数常量。起初我认为使用BitConverter.ToInt32(byteArray, offset) 会让这件事变得简单。但是我现在担心这在大端机器上不起作用。
据我所知,IL 总是对多字节值使用 little-endian 编码:
“所有参数编号均以最小地址处的最低有效字节编码(通常称为“小端”的模式)。” — The Common Language Infrastructure Annotated Standard,Partition III,ch。 1.2(第 482 页)。
由于BitConverter 的转换方法遵循计算机体系结构的字节顺序(可以通过BitConverter.IsLittleEndian 发现),我得出结论,不应使用BitConverter 从IL 字节流中提取多字节值,因为这会在大端机器上给出错误的结果。
这个结论正确吗?
如果是:有没有办法告诉
BitConverter使用哪个字节序进行转换,或者 BCL 中是否有任何其他类提供此功能,或者我是否必须编写自己的转换代码?如果不是:我哪里错了?提取例如的正确方法是什么?来自 IL 字节数组的
Int32操作数值?
【问题讨论】:
标签: clr endianness cil system.reflection bitconverter