From f2f39dcab9a3a7553f4d43d12a7cfd48ebbc22e7 Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 17 Aug 2025 10:53:18 +0300 Subject: [PATCH] math.big: fix bytes() if bit_len is divisible by 60, add tests --- vlib/math/big/big_test.v | 11 +++++++++++ vlib/math/big/integer.v | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/vlib/math/big/big_test.v b/vlib/math/big/big_test.v index 15c422b0a1..59905c5736 100644 --- a/vlib/math/big/big_test.v +++ b/vlib/math/big/big_test.v @@ -991,3 +991,14 @@ fn test_pow2_is_power_of_2() { assert big.two_int.pow(n).is_power_of_2(), 'pow2: ${n}' } } + +fn test_bytes_from_bytes() { + input := ['0', '9999999999999999999999999999999999999', '783086277830859384', + '890810171456467012368983335296321559'] + for n in input { + a := big.integer_from_string(n)! + b, _ := a.bytes() + c := big.integer_from_bytes(b) + assert a.str() == c.str() + } +} diff --git a/vlib/math/big/integer.v b/vlib/math/big/integer.v index 8f169301e6..78be0d2614 100644 --- a/vlib/math/big/integer.v +++ b/vlib/math/big/integer.v @@ -891,7 +891,11 @@ pub fn (a Integer) bytes() ([]u8, int) { bits_in_byte = 0 } // MSB digit - for i := bit_len % digit_bits - 1; i >= 0; i-- { + mut msb_bits := bit_len % digit_bits + if msb_bits == 0 { + msb_bits = digit_bits + } + for i := msb_bits - 1; i >= 0; i-- { bit = u8((digit >> i) & 1) current_byte = (current_byte << 1) | u8(bit) bits_in_byte++