Составители:
Рубрика:
}
}
#endregion
}
public class CilCodec
{
public static Instruction[] DecodeCil(byte[] cilStream)
{
int offset = 0;
ArrayList instructions = new ArrayList();
while (offset < cilStream.Length)
{
OpCode code;
short s2 = cilStream[offset];
if (s2 == 0xFE)
{
byte s1 = cilStream[offset+1];
code = (OpCode)(codes[((s2 << 8) | s1)]);
}
else
code = (OpCode)(codes[s2]);
Instruction ins = new Instruction(code,offset);
offset += code.Size;
switch (code.OperandType)
{
case OperandType.InlineNone: /* None */
break;
case OperandType.ShortInlineBrTarget: /* int8 */
ins.Operand = offset + 1 +
(sbyte)cilStream[offset];
offset++;
break;
case OperandType.InlineI: /* int32 */
ins.Operand = BitConverter.ToInt32(cilStream,offset);
offset += 4;
Исходный код программы CilCodec
293
private object operand;
private int offset;
private string formatOperand()
{
string s;
switch (code.OperandType)
{
case OperandType.InlineNone: /* None */
return “”;
case OperandType.ShortInlineBrTarget: /* int8 */
case OperandType.InlineBrTarget: /* int32 */
return String.Format(“IL_{0:X8}”,operand);
case OperandType.InlineI: /* int32 */
return String.Format(“0x{0:X8}”,operand);
case OperandType.InlineI8: /* int64 */
return String.Format(“0x{0:X16}”,operand);
case OperandType.ShortInlineI: /* int8 */
return String.Format(“0x{0:X2}”,operand);
case OperandType.ShortInlineVar: /* unsigned int8 */
case OperandType.InlineVar: /* unsigned int16 */
return String.Format(“{0:d}”,operand);
case OperandType.ShortInlineR: /* float32 */
case OperandType.InlineR: /* float64 */
return String.Format(“{0:e}”,operand);
case OperandType.InlineSwitch: /* switch */
s = “(“;
foreach (int target in (int[])operand)
s += String.Format(“IL_{0:X8}”,target) + “ “;
return s + “)”;
default: /* token */
s = String.Format(“{0:X8}”,operand);
return “(“+s.Substring(0,2)+”)”+s.Substring(2);
292
CIL и системное программирование в Microsoft .NET
292 CIL и системное программирование в Microsoft .NET Исходный код программы CilCodec 293
private object operand; }
private int offset; }
private string formatOperand() #endregion
{ }
string s;
public class CilCodec
switch (code.OperandType) {
{ public static Instruction[] DecodeCil(byte[] cilStream)
case OperandType.InlineNone: /* None */ {
return “”; int offset = 0;
ArrayList instructions = new ArrayList();
case OperandType.ShortInlineBrTarget: /* int8 */
case OperandType.InlineBrTarget: /* int32 */ while (offset < cilStream.Length)
return String.Format(“IL_{0:X8}”,operand); {
OpCode code;
case OperandType.InlineI: /* int32 */ short s2 = cilStream[offset];
return String.Format(“0x{0:X8}”,operand); if (s2 == 0xFE)
{
case OperandType.InlineI8: /* int64 */ byte s1 = cilStream[offset+1];
return String.Format(“0x{0:X16}”,operand); code = (OpCode)(codes[((s2 << 8) | s1)]);
}
case OperandType.ShortInlineI: /* int8 */ else
return String.Format(“0x{0:X2}”,operand); code = (OpCode)(codes[s2]);
case OperandType.ShortInlineVar: /* unsigned int8 */ Instruction ins = new Instruction(code,offset);
case OperandType.InlineVar: /* unsigned int16 */ offset += code.Size;
return String.Format(“{0:d}”,operand);
switch (code.OperandType)
case OperandType.ShortInlineR: /* float32 */ {
case OperandType.InlineR: /* float64 */ case OperandType.InlineNone: /* None */
return String.Format(“{0:e}”,operand); break;
case OperandType.InlineSwitch: /* switch */ case OperandType.ShortInlineBrTarget: /* int8 */
s = “(“; ins.Operand = offset + 1 +
foreach (int target in (int[])operand) (sbyte)cilStream[offset];
s += String.Format(“IL_{0:X8}”,target) + “ “; offset++;
return s + “)”; break;
default: /* token */ case OperandType.InlineI: /* int32 */
s = String.Format(“{0:X8}”,operand); ins.Operand = BitConverter.ToInt32(cilStream,offset);
return “(“+s.Substring(0,2)+”)”+s.Substring(2); offset += 4;
Страницы
- « первая
- ‹ предыдущая
- …
- 151
- 152
- 153
- 154
- 155
- …
- следующая ›
- последняя »
