如何在不制作任何副本的情况下将 bytes::Bytes 转换为 &str ?
How can I convert a bytes::Bytes to a &str without making any copies?
我有一个 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()
}
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)
}
另请参阅:
- How do I convert a Vector of bytes (u8) to a string
I've tried &body.into()
From
和 Into
仅用于绝对可靠的转换。并非所有任意数据块都是有效的 UTF-8。
我有一个 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()
}
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)
}
另请参阅:
- How do I convert a Vector of bytes (u8) to a string
I've tried
&body.into()
From
和 Into
仅用于绝对可靠的转换。并非所有任意数据块都是有效的 UTF-8。