如何在不进行任何复制的情况下将bytes :: Bytes转换为&str?

时间:2018-12-18 21:42:14

标签: rust type-conversion binary-data

我有一个bytes::Bytes(在这种情况下,它是actix-web中请求的主体),另一个函数需要一个字符串切片参数:foo: &str。将bytes::Bytes转换为&str以便不进行复制的正确方法是什么?我已经尝试过&body.into(),但得到了:

the trait `std::convert::From<bytes::bytes::Bytes>` is not implemented for `str`

以下是基本的功能签名:

pub fn parse_body(data: &str) -> Option<&str> {
    // Do stuff
    // ....
    Ok("xyz")
}

fn consume_data(req: HttpRequest<AppState>, body: bytes::Bytes) -> HttpResponse {
    let foo = parse_body(&body);
    // Do stuff
    HttpResponse::Ok().into()
}

1 个答案:

答案 0 :(得分:4)

Bytes dereferences to [u8],因此您可以使用任何现有机制将&[u8]转换为字符串。

use bytes::Bytes; // 0.4.10
use std::str;

fn example(b: &Bytes) -> Result<&str, str::Utf8Error> {
    str::from_utf8(b)
}

另请参阅:

  

我尝试过&body.into()

FromInto仅用于可靠的转换。并非所有的任意数据块都是有效的UTF-8。