From 481ca4f7a43715e51c511cd185aefdc6a02561f1 Mon Sep 17 00:00:00 2001 From: jbevain Date: Fri, 17 Jun 2011 16:13:14 +0200 Subject: [PATCH] Fix reading and writing of signed compressed integers --- Mono.Cecil.PE/ByteBuffer.cs | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/Mono.Cecil.PE/ByteBuffer.cs b/Mono.Cecil.PE/ByteBuffer.cs index 1f94cde00..c7ae7aee1 100644 --- a/Mono.Cecil.PE/ByteBuffer.cs +++ b/Mono.Cecil.PE/ByteBuffer.cs @@ -140,11 +140,16 @@ public uint ReadCompressedUInt32 () public int ReadCompressedInt32 () { - var value = (int) ReadCompressedUInt32 (); - - return (value & 1) != 0 - ? -(value >> 1) - : value >> 1; + var value = (int) (ReadCompressedUInt32 () >> 1); + if ((value & 1) == 0) + return value; + if (value < 0x40) + return value - 0x40; + if (value < 0x2000) + return value - 0x2000; + if (value < 0x10000000) + return value - 0x10000000; + return value - 0x20000000; } public float ReadSingle () @@ -267,7 +272,19 @@ public void WriteCompressedUInt32 (uint value) public void WriteCompressedInt32 (int value) { - WriteCompressedUInt32 ((uint) ((value < 0) ? ((-value) << 1) | 1 : value << 1)); + if (value >= 0) { + WriteCompressedUInt32 ((uint) (value << 1)); + return; + } + + if (value > -0x40) + value = 0x40 + value; + else if (value >= -0x2000) + value = 0x2000 + value; + else if (value >= -0x20000000) + value = 0x20000000 + value; + + WriteCompressedUInt32 ((uint) ((value << 1) | 1)); } public void WriteBytes (byte [] bytes)