1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

safe unpack on field to uint casts

This commit is contained in:
dark64 2021-09-27 15:07:14 +02:00
parent 942901c55b
commit 42fd168029
6 changed files with 28 additions and 36 deletions

View file

@ -1,9 +1,7 @@
from "EMBED" import unpack, u16_from_bits
from "field" import FIELD_SIZE_IN_BITS
import "utils/pack/bool/unpack"
import "utils/casts/u16_from_bits"
const field U16_MAX = 65535
// Condition: field value is asserted to be in range [0, U16_MAX]
def main(field input) -> u16:
assert(input <= U16_MAX)
bool[16] bits = unpack(input)
return u16_from_bits(bits)
bool[FIELD_SIZE_IN_BITS] bits = unpack(input)
return u16_from_bits(bits[FIELD_SIZE_IN_BITS-16..])

View file

@ -1,9 +1,7 @@
from "EMBED" import unpack, u32_from_bits
from "field" import FIELD_SIZE_IN_BITS
import "utils/pack/bool/unpack"
import "utils/casts/u32_from_bits"
const field U32_MAX = 4294967295
// Condition: field value is asserted to be in range [0, U32_MAX]
def main(field input) -> u32:
assert(input <= U32_MAX)
bool[32] bits = unpack(input)
return u32_from_bits(bits)
bool[FIELD_SIZE_IN_BITS] bits = unpack(input)
return u32_from_bits(bits[FIELD_SIZE_IN_BITS-32..])

View file

@ -1,9 +1,7 @@
from "EMBED" import unpack, u64_from_bits
from "field" import FIELD_SIZE_IN_BITS
import "utils/pack/bool/unpack"
import "utils/casts/u64_from_bits"
const field U64_MAX = 18446744073709551615
// Condition: field value is asserted to be in range [0, U64_MAX]
def main(field input) -> u64:
assert(input <= U64_MAX)
bool[64] bits = unpack(input)
return u64_from_bits(bits)
bool[FIELD_SIZE_IN_BITS] bits = unpack(input)
return u64_from_bits(bits[FIELD_SIZE_IN_BITS-64..])

View file

@ -1,9 +1,7 @@
from "EMBED" import unpack, u8_from_bits
from "field" import FIELD_SIZE_IN_BITS
import "utils/pack/bool/unpack"
import "utils/casts/u8_from_bits"
const field U8_MAX = 255
// Condition: field value is asserted to be in range [0, U8_MAX]
def main(field input) -> u8:
assert(input <= U8_MAX)
bool[8] bits = unpack(input)
return u8_from_bits(bits)
bool[FIELD_SIZE_IN_BITS] bits = unpack(input)
return u8_from_bits(bits[FIELD_SIZE_IN_BITS-8..])

View file

@ -4,11 +4,11 @@
"tests": [
{
"input": {
"values": ["0", "1", "18446744073709551615", "42", "0", "1", "4294967295", "42", "0", "1", "65535", "42", "0", "1", "255", "42"]
"values": ["0", "1", "18446744073709551615", "18446744073709551616", "18446744073709551658", "0", "1", "4294967295", "4294967296", "4294967338", "0", "1", "65535", "65536", "65578", "0", "1", "255", "256", "298"]
},
"output": {
"Ok": {
"values": ["0", "1", "18446744073709551615", "42", "0", "1", "4294967295", "42", "0", "1", "65535", "42", "0", "1", "255", "42"]
"values": ["0", "1", "18446744073709551615", "0", "42", "0", "1", "4294967295", "0", "42", "0", "1", "65535", "0", "42", "0", "1", "255", "0", "42"]
}
}
}

View file

@ -3,13 +3,13 @@ import "utils/casts/field_to_u32"
import "utils/casts/field_to_u16"
import "utils/casts/field_to_u8"
def main(field[4] a, field[4] b, field[4] c, field[4] d) -> (u64[4], u32[4], u16[4], u8[4]):
u64[4] e = [0; 4]
u32[4] f = [0; 4]
u16[4] g = [0; 4]
u8[4] h = [0; 4]
def main(field[5] a, field[5] b, field[5] c, field[5] d) -> (u64[5], u32[5], u16[5], u8[5]):
u64[5] e = [0; 5]
u32[5] f = [0; 5]
u16[5] g = [0; 5]
u8[5] h = [0; 5]
for u32 i in 0..4 do
for u32 i in 0..5 do
e[i] = field_to_u64(a[i])
f[i] = field_to_u32(b[i])
g[i] = field_to_u16(c[i])