我已经将文件转换为字节并有一个 vec/array
[68, 114, 97, 109, 97, 116, 105, 99, 32, 115, 97, 120, 97, 112, 104, 111, 110, 101, 32, 112, 108, 97, 121, 115, 32, 73, 78, 32, 84, 72, 69, 32, 68, 73, 83, 84, 65, 78, 67, 69]
当我将其连接起来时,我得到了数字 4920555689216983877
现在我的问题在于,每当我尝试将此数字转换回字节时,我最终只会得到 8 个结尾字节。
我用 Rust 的默认值和 BigInt 板条箱对此进行了测试,但我对其中任何一个都不满意:
use num_bigint::{BigUint, ToBigUint};
use num_traits::{Zero, One, ToPrimitive, ToBytes, Num};
fn main() {
let the_u8: u128 = 4920555689216983877;
let bigone = (4920555689216983877 as u128).to_biguint().expect("might fail");
let the_u8bytes: [u8;16] = the_u8.to_be_bytes(); //Using a simple array for demonstrated purposes
let bigonebytes: Vec<u8> = bigone.to_be_bytes();
println!("Bytes of base u8: {:?}", the_u8bytes);
println!("Base of BigInt: {:?}", bigonebytes);
}
[dependencies]
num-bigint = "0.4.4"
num-traits = "0.2.18"
由于某种原因,我无法重新组装我的程序中不可或缺的原始文件,但我感觉好像我遵循了逆向工程这个简化过程的所有逻辑步骤。有人可以解释到底出了什么问题并帮助我制定应对策略吗?
我之前问过类似的问题,但没有最好的最小可重现示例,现在我已经努力制作一个单独的项目来尝试重现我的问题,我面临着类似的困境。
这是我用来创建单数 int 来表示十进制格式的所有字节的函数:
fn concatenate_bytes(bytes: &[u8]) -> BigUint {
println!("Bytes: {:?}", bytes);
let mut result = 0;
let mut raw_dog = bytes.as_ptr();
for _ in bytes.iter() {
unsafe{
result = (result << 8) | (*raw_dog as u64);
raw_dog = raw_dog.offset(1);
}
}
println!("Result: {}", result);
result.to_biguint().expect("Failed to create uint")
//Is actually valid ??? ^
}
许多评论都是为我自己写的,但如果它们对您没有特别帮助,我理解。
您的
concatenate_bytes
函数正在丢失信息。 result
变量是 u64
意味着它最多只包含 8 个字节的信息。如果您将一个字节放入其中,然后再 << 8
八次,那么该字节就会从结果中“推出”。因此 result
最终仅反映最后 8 个字节。
如果您使用保留
BigUint
中所有字节的函数(例如 from_bytes_be
),那么您会从原始数据中得到如下数字:
571099513965487418103312191225646346334778926396615879607986731592501905638024494155407303787333
将此数字加载为
BigUint
并使用 to_bytes_be
将返回原始字节。