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]
,即1024
u8
的固定长度向量。这避免了堆分配。)

.read()
返回
选项
:对于
某些(n)
n
将永远不会超过正在读取的向量的长度。
stream.write(b"Hello World\r\n")