如何将u8字节向量转换为rust_decimal?跨语言大数字加载难题
将u8字节数组转换为rust_decimal(带指定小数位)
场景说明
已知:
measure_value.value:存储数值的Vec<u8>数组(示例vec![1, 0, 0]对应数值100)measure_value.scale:u32类型的小数位数(即Decimal的scale参数)
转换方案
根据字节数组的编码方式,分两种常见情况处理:
情况1:字节数组为十进制数字的数值数组(每个u8对应一位十进制数)
比如vec![1,0,0]直接对应十进制数100,这种场景下可以先将数组转为字符串,再通过from_str_with_scale生成Decimal:
use rust_decimal::Decimal; // 将u8数组转换为十进制字符串 let num_str: String = measure_value.value .iter() .map(|&digit| { // 确保每个u8是合法的十进制数字(0-9) char::from_digit(digit as u32, 10) .expect("字节数组包含非十进制数字的元素") }) .collect(); // 转换为Decimal,指定小数位数 let r_dec = Decimal::from_str_with_scale(&num_str, measure_value.scale) .expect("Decimal转换失败:可能是数值过长(超过28位有效数字)或scale非法");
情况2:字节数组为大端序的二进制整数表示
如果字节数组是数值的二进制大端编码(比如vec![0x64]对应100,vec![0, 0x64]对应100),则先将数组转为无符号整数,再通过from_u128_with_scale生成Decimal:
use rust_decimal::Decimal; use std::convert::TryInto; // 将大端序字节数组转为u128(数组长度不能超过16字节) let int_value = match measure_value.value.as_slice().try_into() { Ok(byte_arr) => u128::from_be_bytes(byte_arr), Err(_) => panic!("字节数组长度超过16字节,无法转换为u128"), }; // 转换为Decimal,指定小数位数 let r_dec = Decimal::from_u128_with_scale(int_value, measure_value.scale) .expect("Decimal转换失败:数值超出范围或scale非法");
注意事项
- rust_decimal的Decimal最多支持28位有效数字,如果数值超过这个长度,转换会失败,需要提前做截断或处理。
- 如果字节数组是小端序编码,将
u128::from_be_bytes替换为u128::from_le_bytes即可。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

