Arrays 如何将字节片(&;[u8])的缓冲区转换为整数?
我正在从文件中读取原始数据,并希望将其转换为整数:Arrays 如何将字节片(&;[u8])的缓冲区转换为整数?,arrays,casting,rust,slice,Arrays,Casting,Rust,Slice,我正在从文件中读取原始数据,并希望将其转换为整数: fn main() { let buf: &[u8] = &[0, 0, 0, 1]; let num = slice_to_i8(buf); println!("1 == {}", num); } pub fn slice_to_i8(buf: &[u8]) -> i32 { unimplemented!("what should I do here?") } 我想在C中进行强
fn main() {
let buf: &[u8] = &[0, 0, 0, 1];
let num = slice_to_i8(buf);
println!("1 == {}", num);
}
pub fn slice_to_i8(buf: &[u8]) -> i32 {
unimplemented!("what should I do here?")
}
我想在C中进行强制转换,但在Rust中我该怎么做?我建议使用(在无std环境中也有效):
这些方法仅处理固定长度数组,以避免在数据不足时处理错误。如果你有一个切片,你需要
另见:
no\u std
环境中的工作解决方案no_std
构建:
方法1(try\u into
+from\u be\u bytes
)
use core::conver::TryInto
用于no\u std
build。使用标准板条箱的方法如下:使用std::convert::TryInto代码>
(关于Endian的问题已经得到了回答,但让我把它放在一个地方:,并根据整数在内存中的表示方式使用它们)
方法2(clone\u from\u slice
+from\u be\u bytes
)
结果
在这两种情况下,integer都将等于0x03040506
此自定义序列化(反序列化)u8(反序列化)i32库将在u8数组和i32数组之间安全地来回转换,即serialise函数将获取所有u8值并将其打包为i32值,反序列化函数将获取此库的自定义i32值值,并将其转换回最初的u8值
这是为了一个特定的目的,但它可能会在其他用途派上用场;取决于您是否想要/需要这样的快速/自定义转换器
如果您只读取单个项目,也可以使用BigEndian::read_i32(&bytes[…])。如果buf是vec怎么办?@user2284570您不必为vec做任何特殊的操作。另见。你必须关心数据的结尾。这是12345
和54321
之间的区别。只要作者和读者都同意数据的结尾,你就可以了。如果你正在写它,那么选择一个,并始终如一地使用它。大多数人可能会选择little endian。@Shepmaster相反,我需要保留现有的字节顺序,并且代码将在支持未对齐内存访问的cpu上运行。既然似乎没有from ptr()的函数,那么如何在没有from be\u bytes
的情况下执行相同的操作呢?似乎Vec
没有read_32
@user2284570;这并没有给现有的答案增加任何内容,该答案已经讨论了从字节开始的
/从字节开始的
/从字节开始的,并链接到一个问题,该问题显示了如何从切片中获取固定大小的数组。@Shepmaster很遗憾你这么认为。我真的不同意,因为我收集了所有stackoverflow答案中的所有信息,并决定将其放在这里以方便使用。在这个答案中,我补充了两点:1。在no\u std
环境中要做什么。2.如原始问题所述,如何处理切片(无需跳转到链接)。3.没有字节序怎么办?
。字节序在无std的环境下工作,点击链接在互联网上不是负担,现有的答案是关于避免字节序。@Shepmaster顺便说一句,我没有注意到这是你的答案/问题聚会。。)但您应该知道,在您的答案中并没有真正注意到“请参阅”的注释,而且在您的答案中看到关于如何将数组转换为整数而不是将切片转换为整数的代码片段也是非常令人困惑的。你可能会有不同的想法,我只是告诉你它是什么样子。不管怎样,你只是可以改进你自己的答案,对吗?(附言:“点击链接不是互联网的负担”-这是你的主观观点,与我的观点不同)作为一个新手,我非常欣赏这个答案,因为它展示了如何从中间阅读
use byteorder::{BigEndian, ReadBytesExt}; // 1.2.7
fn main() {
let mut buf: &[u8] = &[0, 0, 0, 1];
let num = buf.read_u32::<BigEndian>().unwrap();
assert_eq!(1, num);
}
fn main() {
let buf = [0, 0, 0, 1];
let num = u32::from_be_bytes(buf);
assert_eq!(1, num);
}
use core::convert::TryInto;
let src = [1, 2, 3, 4, 5, 6, 7];
// 0x03040506
u32::from_be_bytes(src[2..6].try_into().unwrap());
let src = [1, 2, 3, 4, 5, 6, 7];
let mut dst = [0u8; 4];
dst.clone_from_slice(&src[2..6]);
// 0x03040506
u32::from_be_bytes(dst);