我无法从 Rust 中的串联字节字符串中获取原始字节

问题描述 投票:0回答:1

我已经将文件转换为字节并有一个 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 ??? ^
}

许多评论都是为我自己写的,但如果它们对您没有特别帮助,我理解。

rust vector byte slice biginteger
1个回答
0
投票

您的

concatenate_bytes
函数正在丢失信息。
result
变量是
u64
意味着它最多只包含 8 个字节的信息。如果您将一个字节放入其中,然后再
<< 8
八次,那么该字节就会从结果中“推出”。因此
result
最终仅反映最后 8 个字节。

如果您使用保留

BigUint
中所有字节的函数(例如
from_bytes_be
),那么您会从原始数据中得到如下数字:

571099513965487418103312191225646346334778926396615879607986731592501905638024494155407303787333

将此数字加载为

BigUint
并使用
to_bytes_be
将返回原始字节。

© www.soinside.com 2019 - 2024. All rights reserved.