diff options
author | jbevain <jbevain@gmail.com> | 2011-06-17 18:13:14 +0400 |
---|---|---|
committer | jbevain <jbevain@gmail.com> | 2011-06-17 18:13:34 +0400 |
commit | 481ca4f7a43715e51c511cd185aefdc6a02561f1 (patch) | |
tree | 53a32ba4ac977946bb36fbcfe92877de2a24a0a5 /Mono.Cecil.PE | |
parent | 2e6f7c2fe8eba3cf2f9841a8efc9641da3f65ed3 (diff) |
Fix reading and writing of signed compressed integers
Diffstat (limited to 'Mono.Cecil.PE')
-rw-r--r-- | Mono.Cecil.PE/ByteBuffer.cs | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/Mono.Cecil.PE/ByteBuffer.cs b/Mono.Cecil.PE/ByteBuffer.cs index 1f94cde..c7ae7ae 100644 --- a/Mono.Cecil.PE/ByteBuffer.cs +++ b/Mono.Cecil.PE/ByteBuffer.cs @@ -140,11 +140,16 @@ namespace Mono.Cecil.PE { 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 @@ namespace Mono.Cecil.PE { 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) |