gpt4 book ai didi

file - 为什么 File::bytes 以不同于 hexdump 的顺序遍历字节?

转载 作者:行者123 更新时间:2023-11-29 08:18:37 24 4
gpt4 key购买 nike

我正在尝试读取文件的一些原始字节,所以我查看了文档并将一个函数放在一起,该函数看起来应该将字节读入一个向量并从头部开始读取 32 位整数。

fn filetobytes(name: &'static str) -> Vec<u8> {
let file = File::open(name).expect("No such file");
let filebytes: Vec<u8> = file.bytes().map(|readbyte| readbyte.unwrap()).collect();

return filebytes;
}

fn parse_int(index: usize, vector: &Vec<u8>) -> u32 {
let mut num: u32 = 0;
for i in 0..4 {
num = num << 8;
num = num | ((vector[index + i] as u32) & 0xff);
println!("Byte is {:x}", vector[index + i]);
}
return num;
}

fn main() {
let filebytes = filetobytes("diddy.h");
println!("0x{:x}", parse_int(0, &filebytes));
}

然后我尝试继续前进,但很快发现我的逻辑都不起作用。在做了一些嗅探之后,我发现我没有按照我预期的顺序获取字节。例如,上面的代码(分别打印前四个字节然后合成为一个整数)产生以下输出

Byte is 23
Byte is 64
Byte is 65
Byte is 66
0x23646566

如果我在 diddy.h 上执行 hexdump,我会得到以下输出。

0000000 6423 6665 6e69 2065 4944 4444 5f59 4957
0000010 5444 2048 3031 0a35 6423 6665 6e69 2065
0000020 4944 4444 5f59 4548 4749 5448 3120 3035
0000030 630a 6e6f 7473 7520 736e 6769 656e 2064
0000040 6873 726f 2074 6964 6464 5f79 6164 6174
0000050 315b 3735 3035 3b5d 000a
0000059

奇怪的是,似乎vector[0]访问字节1,vector[1]访问字节0,vector[2]获取字节 3,vector[3] 获取字节 2,依此类推。

我可能做了什么导致这种行为,我该如何解决?

最佳答案

Jan Zerebecki 的评论是正确的,但稍作阐述可能会有所帮助:

Hexdump 默认将文件显示为 16 位整数值的集合。它们出现“错误顺序”的原因是 Hexdump 尊重主机的字节顺序,而您在小端机器上运行它。

让我们使用 hexdump 的自定义输出格式选项做一个例子。首先,我们将编写一个与 xxd 兼容的十六进制转储,并将其转换为二进制。

$ echo 00000000: 01 23 45 67 89 ab cd ef > num.hex
$ xxd -r num.hex num.bin

然后我们将向自己证明 hexdump 可以使用规范输出模式读取它:

$ hexdump -C num.bin
00000000 01 23 45 67 89 ab cd ef |.#Eg....|
00000008

接下来,我们将使用它相当晦涩的输出格式选项将值显示为十六进制,但一次选择 1、2、4 和 8 个字节:

$ hexdump -e '1/1 "%02x "' num.bin
01 23 45 67 89 ab cd ef
$ hexdump -e '1/2 "%02x "' num.bin
2301 6745 ab89 efcd
$ hexdump -e '1/4 "%02x "' num.bin
67452301 efcdab89
$ hexdump -e '1/8 "%02x "' num.bin
efcdab8967452301

您看到的是 hexdump 将这些字节解释为不同大小的小端整数,并执行将最高有效数字放在左侧所需的字节交换......我们喜欢表示数字的方式。

关于file - 为什么 File::bytes 以不同于 hexdump 的顺序遍历字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46997109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com