首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是最合适的方式,将咬口转换为一个u64?

什么是最合适的方式,将咬口转换为一个u64?
EN

Stack Overflow用户
提问于 2015-06-15 00:36:27
回答 1查看 1.6K关注 0票数 7

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

目前,我已经将字符串解析为一个u8值的向量,每个向量表示四位(或“咬”)。我编写了以下代码以获取Vec<u8>并返回相应的u64。它可以工作(据我的测试显示),但我不确定这是否是铁锈的“适当”方式去做这件事。

代码语言:javascript
复制
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;
}

我想我不知道如何将u8转换为u64值的主要问题。你能评论一下用一种更地道的、类似锈蚀的风格改进或编写代码的方法吗?

编辑:我尝试了以下不安全块的替代(不成功):

或者用i作为u64

代码语言:javascript
复制
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;

或者直接使用i

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-15 01:11:19

您的问题很简单:for i in values,其中values的类型是&Vec<u8>,迭代对每个值的引用;也就是说,i&u8类型的。使用引用进行Oring和添加之类的操作没有意义;您需要取消引用,获取底层的u8。最简单的方法是将其写入for循环的模式(对于for语法是for PATTERN in EXPRESSION,如果需要,请参阅关于模式的文档以获得更多解释;对于这个简单的例子,for &x in y { … }基本上意味着for x in y { let x = *x; … }):

代码语言:javascript
复制
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也可以折叠整个循环形式,如下所示:

代码语言:javascript
复制
fn convert_nibbles_to_u64(values: &[u8]) -> u64 {
    values.iter().fold(0, |x, &i| x << 4 | i as u64)
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30835978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档