Skip to content

Commit

Permalink
Merge pull request #6 from multiversx/encode-signed-numbers
Browse files Browse the repository at this point in the history
Fix encode signed numbers.
  • Loading branch information
ramonalobont authored Feb 6, 2024
2 parents c622856 + 7262515 commit dfcc3f4
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 1 deletion.
5 changes: 4 additions & 1 deletion multiversx_sdk/core/codec.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ def encode_unsigned_number(arg: int) -> bytes:


def encode_signed_number(arg: int) -> bytes:
return arg.to_bytes(INTEGER_MAX_NUM_BYTES, byteorder="big", signed=True).lstrip(bytes([255]))
if arg == 0:
return b''
length = ((arg + (arg < 0)).bit_length() + 7 + 1) // 8
return arg.to_bytes(length, byteorder="big", signed=True)


def decode_unsigned_number(arg: bytes) -> int:
Expand Down
75 changes: 75 additions & 0 deletions multiversx_sdk/core/codec_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from multiversx_sdk.core import codec

test_vectors_1 = [
[-1, 0xFF],
[1, 0x01],
[2, 0x02],
[-2, 0xFE],
[3, 0x03],
[-3, 0xFD],
[4, 0x04],
[-4, 0xFC],
]

test_vectors_2 = [
[-1, 0xFF],
[1, 0x01],
[2, 0x02],
[-2, 0xFE],
[3, 0x03],
[-3, 0xFD],
[4, 0x04],
[-4, 0xFC],
[5, 0x05],
[-5, 0xFB],
[6, 0x06],
[-6, 0xFA],
]

test_vectors_3 = [
[125, 0x7D],
[-125, 0x83],
[126, 0x7E],
[-126, 0x82],
[127, 0x7F],
[-127, 0x81],
[-128, 0x80],
]

test_vectors_4 = [
[128, [0x00, 0x80]],
[129, [0x00, 0x81]],
[-129, [0xFF, 0x7F]],
[130, [0x00, 0x82]],
[-130, [0xFF, 0x7E]],
[253, [0x00, 0xFD]],
[256, [0x01, 0x00]],
[-256, [0xFF, 0x00]],
[-257, [0xFE, 0xFF]],
[258, [0x01, 0x02]],
]


def test_encode_signed_number():
assert codec.encode_signed_number(-256) == bytes([0xFF, 0x00])
assert codec.encode_signed_number(-0x11) == bytes([0xEF])
assert codec.encode_signed_number(-128) == bytes([0x80])
assert codec.encode_signed_number(-1) == bytes([0xFF])
assert codec.encode_signed_number(0) == bytes([])
assert codec.encode_signed_number(1) == bytes([0x01])
assert codec.encode_signed_number(256) == bytes([0x01, 0x00])
assert codec.encode_signed_number(127) == bytes([0x7F])
assert codec.encode_signed_number(0x11) == bytes([0x11])
assert codec.encode_signed_number(255) == bytes([0x00, 0xFF])

for [input_data, expected_data] in test_vectors_1:
assert codec.encode_signed_number(input_data) == bytes([expected_data])

for [input_data, expected_data] in test_vectors_2:
assert codec.encode_signed_number(input_data) == bytes([expected_data])

for [input_data, expected_data] in test_vectors_3:
assert codec.encode_signed_number(input_data) == bytes([expected_data])

for [input_data, [expected_data_1, expected_data_2]] in test_vectors_4:
assert codec.encode_signed_number(input_data) == bytes([expected_data_1, expected_data_2])

0 comments on commit dfcc3f4

Please sign in to comment.