use crate::field::Goldilocks;
#[inline]
pub fn encode_7(chunk: &[u8]) -> Goldilocks {
let mut buf = [0u8; 8];
let len = chunk.len().min(7);
buf[..len].copy_from_slice(&chunk[..len]);
Goldilocks::new(u64::from_le_bytes(buf))
}
#[inline]
pub fn decode_8(element: Goldilocks) -> [u8; 8] {
element.as_u64().to_le_bytes()
}
pub fn bytes_to_field_elements(bytes: &[u8], out: &mut [Goldilocks]) -> usize {
if bytes.is_empty() {
return 0;
}
let n_chunks = bytes.len().div_ceil(7);
let n = n_chunks.min(out.len());
for (i, elem) in out.iter_mut().take(n).enumerate() {
let start = i * 7;
let end = (start + 7).min(bytes.len());
*elem = encode_7(&bytes[start..end]);
}
n
}
pub fn field_elements_to_bytes(elements: &[Goldilocks], out: &mut [u8]) -> usize {
let n = elements.len().min(out.len() / 8);
for i in 0..n {
let bytes = decode_8(elements[i]);
out[i * 8..(i + 1) * 8].copy_from_slice(&bytes);
}
n * 8
}