gpt4 book ai didi

rust - 将半字节转换为 u64 的最合适方法是什么?

转载 作者:行者123 更新时间:2023-11-29 07:46:28 24 4
gpt4 key购买 nike

我正在尝试学习 Rust,并决定编写一个将十六进制字符串转换为 u64 的程序。

目前,我已将字符串解析为一个 u8 值向量,每个值代表四个位(或“半字节”)。我写了下面的代码来取 Vec<u8>并返回相应的 u64 .它有效(据我的测试显示),但我不确定它是否是 Rust 中执行此操作的“合适”方式。

fn convert_nibbles_to_u64(values: &Vec<u8>) -> u64 {
// We need to turn this buffer into a u64 now
let mut temp:u64 = 0;
for i in values {
temp = temp << 4;

unsafe {
// We need to unsafely convert a u8 to a u64. Note that
// the host endian-ness will matter here.
use std::mem;
let i_64_buffer = [0u8,0u8,0u8,0u8,0u8,0u8,0u8,i.clone()];
let i_64 = mem::transmute::<[u8; 8], u64>(i_64_buffer);
let i_64_be = u64::from_be(i_64);
temp = temp | i_64_be;
}
}
return temp;
}

我想主要的问题是我不知道如何转换 u8u64值(value)。您能否评论以更惯用的、类似 Rust 的风格改进或编写代码的方法?

编辑:我已经尝试了以下(不成功的)不安全 block 的替代方法:

Or'ing with i作为u64 :

temp = temp | i as u64; 
------
Compiler error:
main.rs:115:23: 115:31 error: non-scalar cast: `&u8` as `u64`
main.rs:115 temp = temp | i as u64;

Or'ing with i直接:

temp = temp | i;
------
Compiler error:
main.rs:115:16: 115:24 error: the trait `core::ops::BitOr<&u8>` is not implemented for the type `u64` [E0277]
main.rs:115 temp = temp | i;

最佳答案

您的问题很简单:for i in values , 其中values类型为 &Vec<u8> , 遍历对每个值的引用;即 i类型为 &u8 . Oring 和 adding 等带有引用的操作没有意义;您需要取消引用它,获取基础 u8 .最简单的方法是将其写入 for循环的模式(对于 for 语法是 for PATTERN in EXPRESSION ,如果需要,请参阅模式文档以获得更多解释;对于这个简单的例子, for &x in y { … } 基本上意味着 for x in y { let x = *x; … } ):

fn convert_nibbles_to_u64(values: &[u8]) -> u64 {
let mut out = 0;
for &i in values {
out = out << 4 | i as u64;
}
out
}

可以使用 Iterator.fold 折叠整个循环形式,也像这样:

fn convert_nibbles_to_u64(values: &[u8]) -> u64 {
values.iter().fold(0, |x, &i| x << 4 | i as u64)
}

关于rust - 将半字节转换为 u64 的最合适方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835978/

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