From 8ee960252688693b311caa6609d8531b8e312a25 Mon Sep 17 00:00:00 2001 From: 4tochka Date: Mon, 8 Apr 2019 16:50:30 +0200 Subject: [PATCH] cint bug fix --- pybtc/functions/tools.py | 11 +++++----- pybtc/test/integer.py | 47 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/pybtc/functions/tools.py b/pybtc/functions/tools.py index a1864c4..868f336 100644 --- a/pybtc/functions/tools.py +++ b/pybtc/functions/tools.py @@ -180,11 +180,10 @@ def int_to_c_int(n, base_bytes=1): return b'\x00' * base_bytes else: l = n.bit_length() + 1 - min_bits = base_bytes * 8 - 1 - if l <= min_bits + 1: + if l <= base_bytes * 8: return n.to_bytes(base_bytes, byteorder="big") prefix = 0 - payload_bytes = ceil((l)/8) - base_bytes + payload_bytes = ceil((l)/8) - base_bytes + 1 extra_bytes = int(ceil((l+payload_bytes)/8) - base_bytes) for i in range(extra_bytes): prefix += 2 ** i @@ -232,12 +231,12 @@ def c_int_len(n, base_bytes=1): :return: integer. """ if n == 0: - return 1 + return base_bytes l = n.bit_length() + 1 min_bits = base_bytes * 8 - 1 if l <= min_bits + 1: - return 1 - payload_bytes = ceil((l)/8) - base_bytes + return base_bytes + payload_bytes = ceil((l)/8) - base_bytes + 1 return int(ceil((l+payload_bytes)/8)) diff --git a/pybtc/test/integer.py b/pybtc/test/integer.py index a5940a7..12887f7 100644 --- a/pybtc/test/integer.py +++ b/pybtc/test/integer.py @@ -69,9 +69,6 @@ class IntegerFunctionsTests(unittest.TestCase): self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) self.assertEqual(len(tools.int_to_c_int(i)), 8) for i in range(72057594037927934, 72057594037927938): - # print(i, "[", len(tools.int_to_c_int(i)), "]", end=" : " ) - # print_bytes(tools.int_to_c_int(i)) - # print(bin(tools.c_int_to_int((tools.int_to_c_int(i))))) self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) self.assertEqual(len(tools.int_to_c_int(i)), 9) @@ -79,12 +76,56 @@ class IntegerFunctionsTests(unittest.TestCase): self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) self.assertEqual(len(tools.int_to_c_int(i)), 10) + i = 1333870604623599278750 + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) i = 0 self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) self.assertEqual(len(tools.int_to_c_int(i)), 1) + for i in range(1213666705181745367548161 - 10, 1213666705181745367548161 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(310698676526526814092329217 - 10, 310698676526526814092329217 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(79538861190790864407636279553 - 10, 79538861190790864407636279553 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(20361948464842461288354887565569 - 10, 20361948464842461288354887565569 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(5212658806999670089818851216785665 - 10, 5212658806999670089818851216785665 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(1334440654591915542993625911497130241 - 10, 1334440654591915542993625911497130241 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(341616807575530379006368233343265341697 - 10, 341616807575530379006368233343265341697 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + for i in range(87453902739335777025630267735875927474433 - 10, 87453902739335777025630267735875927474433 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(22388199101269958918561348540384237433454849 - 10, 22388199101269958918561348540384237433454849 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(5731378969925109483151705226338364782964441345 - 10, 5731378969925109483151705226338364782964441345 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) + + for i in range(341616807575530379006368233343265341697 - 10, 341616807575530379006368233343265341697 + 10): + self.assertEqual(tools.c_int_to_int((tools.int_to_c_int(i))), i) + self.assertEqual(tools.c_int_len(i), len(tools.int_to_c_int(i))) def test_variable_integer(self): for i in range(0, 0xfd): self.assertEqual(tools.var_int_to_int((tools.int_to_var_int(i))), i)