Tcp 访问&;stras&;[u8]
我用这个让自己发疯,因为从文档判断,它应该是无痛的:我如何将字符串转换成Tcp 访问&;stras&;[u8],tcp,rust,Tcp,Rust,我用这个让自己发疯,因为从文档判断,它应该是无痛的:我如何将字符串转换成&[u8],以便通过TCP或UDP通过有线发送它?字节!()宏仅直接作用于文字 这是一个TCP应用程序的框架,完全来自其他来源。现在它作为一个echo服务器工作。我遇到的绊脚石是如何在终端上将&[u8]打印为字符串,或者如何将字符串从io::stdin().read_line()转换到&[u8]中,通过有线聊天方式发送 编译失败,错误为:类型不匹配:预期为`&[u8]`但找到了`&str`(预期为vector但找到了&str
&[u8]
,以便通过TCP或UDP通过有线发送它?字节!()
宏仅直接作用于文字
这是一个TCP应用程序的框架,完全来自其他来源。现在它作为一个echo服务器工作。我遇到的绊脚石是如何在终端上将&[u8]打印为字符串,或者如何将字符串从io::stdin().read_line()
转换到&[u8]中,通过有线聊天方式发送
编译失败,错误为:类型不匹配:预期为`&[u8]`但找到了`&str`(预期为vector但找到了&str):
我也不认为让mut my_read\u buff=~[0,…1024]
可能是正确的,这看起来像是一个等待发生的C型溢出,我认为应该修复它
我对此感到非常困惑,我的理解是,
&str
是&[u8]
,我被类型系统卡住了,但无法克服这一点。我曾尝试在不安全的块中实现一些来自std::str::raw
的函数,但也没有成功。
具有与和[u8]
相同的表示形式,但它有一个附加的不变量:内容始终是有效的UTF-8,因此它不是同一类型,即必须显式“强制转换”它们之间(有点类似于u8
和i8
具有相同的表示,但需要显式转换才能在适当的位置使用它们)。此“强制转换”是从&str
→ <代码>&[u8],对于另一个方向(在0.8上,反向转换为从_utf8_切片
FWIW)。&str
→ <代码>&[u8]cast非常非常便宜;通过优化,它实际上是零成本的(另一个方向必须检查有效的UTF-8,因此是O(n)),并且在关闭它们的情况下,它仍然是对一个具有非常少量指令的函数的函数调用
因此,您需要:
stream.write(out_msg.as_bytes());
(如果out\u msg
始终是相同的消息,则实际上可以使用b
前缀来获取编译时字节文字:
stream.write(b"Hello World\r\n")
)
我也不认为let mut my_read_buff=~[0,…1024]可能是正确的,这看起来像是一个C风格的溢出等待发生,我认为应该修复生锈 不,向量和切片的长度都存储在其中,因此
.read
调用知道允许填充多少空间,并且不会/不能写入超出其末尾的内容
(FWIW,如果您的缓冲区始终是固定长度的,您可以删除~
,即让mut my_read_buff=[0,…1024];
,因此my_read_buf
将具有类型[u8,…1024]
,即1024u8
的固定长度向量。这避免了堆分配。).read()
返回选项
:对于某些(n)
,n
将永远不会超过正在读取的向量的长度。
stream.write(b"Hello World\r\n")