gpt4 book ai didi

tcp - 以 &[u8] 访问 &str

转载 作者:可可西里 更新时间:2023-11-01 02:32:26 27 4
gpt4 key购买 nike

我正在为这个而疯狂,因为从文档来看它应该是无痛的:如何将字符串转换为 &[u8] 以便我可以通过网络发送它通过 TCP 或 UDP? bytes!() 宏似乎只对文字直接起作用。

这是 TCP 应用程序的框架,完全抄袭自其他来源。现在它作为回声服务器工作。我遇到的绊脚石是弄清楚如何在终端上将 &[u8] 作为字符串打印,或者如何将 io::stdin().read_line() 中的字符串转换为 & [u8] 通过网络发送,聊天式。

由于错误而无法编译:类型不匹配:预期的 `&[u8]` 但找到了 `&str`(预期的向量但找到了 &str):

fn run_tcp_test_server(listen_addr: SocketAddr) {
let mut acceptor = TcpListener::bind(listen_addr).listen().unwrap();
println("[ INFO ] listener is ready.");

loop {
let stream = Cell::new(acceptor.accept().unwrap());
do spawn {
println("[ INFO ] got a request.");

let mut stream = stream.take();

let mut my_read_buff = ~[0, ..1024];
match stream.read(my_read_buff) {
Some(n) => {
stream.write(my_read_buff.slice_to(n));
},
_ => ()
}

let out_msg = "Hello World\r\n";
stream.write(out_msg);
}
}
}

我也不认为 let mut my_read_buff = ~[0, ..1024] 可能是正确的,这看起来像是等待发生的 C 风格溢出,我认为 Rust应该修复。

我对此很困惑,我的理解是 &str&[u8] 并且我被类型系统卡住了,但不能克服这个。我试图在不安全的 block 中实现 std::str::raw 的一些功能,但也没有成功。

最佳答案

&str&[u8] 具有相同的表示,但它有一个额外的不变性:内容始终是有效的 UTF-8,因此它们是不一样的类型,即你必须在它们之间明确地“转换”(有点类似于 u8i8 具有相同的表示但需要显式转换才能在适当的位置使用它们)。这个“类型转换”是用 .as_bytes() 完成的从&str&[u8],和std::str::from_utf8对于另一个方向(在 0.8 上,反向转换是 from_utf8_slice FWIW)。 &str&[u8] 转换非常非常便宜;对其进行优化实际上是零成本(另一个方向必须检查有效的 UTF-8,因此是 O(n)),并且在关闭它们的情况下,它仍然是对具有非常小数量的函数的函数调用说明。

因此,您需要:

stream.write(out_msg.as_bytes());

(如果 out_msg 始终是相同的消息,您实际上可以使用 b 前缀来获取编译时字节文字:

stream.write(b"Hello World\r\n")

)


I also don't think the let mut my_read_buff = ~[0, ..1024] can possibly be right, that seems like a C-style overflow waiting to happen, which I thought Rust was supposed to fix.

不,向量和切片将它们的长度存储在其中,因此 .read 调用知道允许填充多少空间,并且不会/不能写入超出其末尾的空间.

(FWIW,如果您的缓冲区始终是固定长度,您可以删除 ~,即 let mut my_read_buff = [0, ..1024];,所以my_read_buf 将具有 [u8, .. 1024] 类型,即 1024 个 u8 的固定长度向量。这避免了堆分配。 )

关于tcp - 以 &[u8] 访问 &str,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20891327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com