以字符串形式访问 Vec<&[u8]> 的正确方法[重复]

Posted

技术标签:

【中文标题】以字符串形式访问 Vec<&[u8]> 的正确方法[重复]【英文标题】:Proper way to access Vec<&[u8]> as strings [duplicate] 【发布时间】:2019-11-01 23:37:36 【问题描述】:

我有一个Vec&lt;&amp;[u8]&gt;,我想像这样转换为String

let rfrce: Vec<&[u8]> = rec.alleles();

for r in rfrce 
    // create new String from rfrce

我试过了,但它不起作用,因为只能将u8 转换为char,但[u8] 转换为char 是不可能的:

let rfrce = rec.alleles();

let mut str = String::from("");

for r in rfrce 
    str.push(*r as char);

【问题讨论】:

这种转换的预期逻辑是什么?那些[u8] 里有什么? 对于此类问题,我在 freenode 中使用 Rust 社区 IRC 频道(chat.freenode.net 端口:6697,频道名称:##rust)。他们给了我快速的工作答案 【参考方案1】:

因为ru8的数组,所以需要将其转换为有效的&amp;str,并使用Stringpush_str方法。

use std::str;

fn main() 
    let rfrce = vec![&[65,66,67], &[68,69,70]];

    let mut str = String::new();

    for r in rfrce 
        str.push_str(str::from_utf8(r).unwrap());
    

    println!("", str);

Rust Playground

【讨论】:

谢谢,我发现我的 Vec 看起来像 [[67, 84], [71, 84], [67]] 或字符串:CTGTC。我想将 vec 拆分为 3 个字符串:str1 = CT、str2 = GT 和 str3 = C。 带错误处理:play.rust-lang.org/… @fxwiegand 你可以用Vec&lt;&amp;str&gt; :Rust Playground【参考方案2】:

我会选择TryFrom&lt;u32&gt;

fn to_string(v: &[&[u8]]) -> Result<String, std::char::CharTryFromError> 
    /// Transform a &[u8] to an UTF-8 codepoint
    fn su8_to_u32(s: &[u8]) -> Option<u32> 
        if s.len() > 4 
            None
         else 
            let shift = (0..=32).step_by(8);
            let result = s.iter().rev().cloned().zip(shift).map(|(u, shift)| (u as u32) << shift).sum();
            Some(result)
        
    

    use std::convert::TryFrom;

    v.iter().map(|&s| su8_to_u32(s)).try_fold(String::new(), |mut s, u| 
        let u = u.unwrap(); //TODO error handling
        s.push(char::try_from(u)?);
        Ok(s)
    )


fn main() 
    let rfrce: Vec<&[u8]> = vec![&[48][..], &[49][..], &[50][..], &[51][..]];
    assert_eq!(to_string(&rfrce), Ok("0123".into()));

    let rfrce: Vec<&[u8]> = vec![&[0xc3, 0xa9][..]]; // https://www.utf8icons.com/character/50089/utf-8-character
    assert_eq!(to_string(&rfrce), Ok("쎩".into()));


【讨论】:

以上是关于以字符串形式访问 Vec<&[u8]> 的正确方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个转换Vec的好方法 到阵列? [重复]

OpenCV转为灰度图像 & 访问像素方法

向量的指针向量

显示Unicode 字节的对应字符的小技巧

从 Expression<Func<TModel,TProperty>> 以字符串形式获取属性

为实现特征的所有类型实现特征