以字符串形式访问 Vec<&[u8]> 的正确方法[重复]
Posted
技术标签:
【中文标题】以字符串形式访问 Vec<&[u8]> 的正确方法[重复]【英文标题】:Proper way to access Vec<&[u8]> as strings [duplicate] 【发布时间】:2019-11-01 23:37:36 【问题描述】:我有一个Vec<&[u8]>
,我想像这样转换为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】:
因为r
是u8
的数组,所以需要将其转换为有效的&str
,并使用String
的push_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<&str>
:Rust Playground【参考方案2】:
我会选择TryFrom<u32>
:
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]> 的正确方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章