Rust 如何将字节向量(u8)转换为字符串?

Rust 如何将字节向量(u8)转换为字符串?,rust,Rust,我正在尝试用Rust编写简单的TCP/IP客户端,我需要打印出从服务器获得的缓冲区 如何将Vec(或&[u8])转换为字符串?将字节片转换为字符串片(假设采用UTF-8编码): 使用std::str; // //发布fn自_utf8(v:&[u8])->结果 // //假设buf:&[u8] // fn main(){ 设buf=&[0x41u8,0x41u8,0x42u8]; 让s=match str::from_utf8(buf){ Ok(v)=>v, Err(e)=>panic!(“无效的

我正在尝试用Rust编写简单的TCP/IP客户端,我需要打印出从服务器获得的缓冲区


如何将
Vec
(或
&[u8]
)转换为
字符串?

将字节片转换为字符串片(假设采用UTF-8编码):

使用std::str;
//
//发布fn自_utf8(v:&[u8])->结果
//
//假设buf:&[u8]
//
fn main(){
设buf=&[0x41u8,0x41u8,0x42u8];
让s=match str::from_utf8(buf){
Ok(v)=>v,
Err(e)=>panic!(“无效的UTF-8序列:{}”,e),
};
println!(“结果:{}”,s);
}
转换已到位,无需分配。如果需要,可以通过调用字符串切片()上的
.to_owned()
,从字符串切片创建
字符串

转换函数的库参考:

    • 我更喜欢:

      它将无效的UTF-8字节转换为� 因此不需要错误处理。当你不需要它,而我几乎不需要它的时候,它是很好的。实际上,您会从中得到一个
      字符串。这将使打印从服务器获得的内容变得更容易

      有时您可能需要使用该方法,因为它是在写入时克隆的。

      如果您实际有一个字节向量(
      Vec
      )并希望转换为
      字符串,最有效的方法是使用以下资源重用分配:


      在我的例子中,我只需要将数字转换成字符串,而不是根据某种编码将数字转换成字母,所以我这样做了

      fn main() {
          let bytes = vec![0x41, 0x42, 0x43];
          let s = format!("{:?}", &bytes);
          println!("{}", s);
      }
      

      非常感谢您的
      into_owned()
      建议!这正是我要寻找的(例如,这使它成为一个合适的
      字符串
      ,您可以将其作为方法的返回值返回)。� 是Unicode U+FFFD(UTF-8序列0xEF 0xBF 0xBD(八进制357 277 275)),“”。在一些文本编辑器中,它可以通过
      \x{FFFD}
      在正则表达式模式下搜索。tks,此方法很简洁。您可能想补充一点,这是可能的,因为Vec强制切片,尽管示例代码实际上不使用向量:-),尽管来自\u utf8的
      确实没有分配,值得一提的是,它需要扫描数据以验证utf-8的正确性。所以这不是一个O(1)操作(一开始你可能会这么想)谢谢!为什么其他两个答案忽略了这个问题?@Jehan因为人们通常不擅长提问,尤其是当他们刚接触一门语言时。Rust区分了数组、片和
      Vec
      ,但新手不知道它们之间的区别。确保对所有证明有用的问题和答案进行投票。请注意,@Bjorn Tipling提到,您可以在此处使用
      String::from_utf8_lossy
      ,然后您不需要expect调用。编辑:请注意,@Bjorn Tipling提到,您可能认为您可以在此处使用
      String::from_utf8_lossy
      ,然后您不需要
      expect
      调用,但它的输入是一个bytess片段(
      &'a[u8]
      )。哦,还有
      来自未选中的
      。“如果您确定字节片是有效的UTF-8,并且不希望产生转换开销,则此函数存在一个不安全版本[
      来自\u utf8\u lossy]
      来自\u utf8\u unchecked
      ,具有相同的行为,但跳过检查。”请注意,您可以使用
      &vec\u of_bytes
      将其转换回字节片,如来自\u utf8\u lossy
      示例所示。
      
      fn main() {
          let buf = &[0x41u8, 0x41u8, 0x42u8];
          let s = String::from_utf8_lossy(buf);
          println!("result: {}", s);
      }
      
      fn main() {
          let bytes = vec![0x41, 0x42, 0x43];
          let s = String::from_utf8(bytes).expect("Found invalid UTF-8");
          println!("{}", s);
      }
      
      fn main() {
          let bytes = vec![0x41, 0x42, 0x43];
          let s = format!("{:?}", &bytes);
          println!("{}", s);
      }