我有一个类型为UInt8且固定长度为10的向量。我认为它包含一个以Null结尾的字符串,但是当我执行String(v)时,它将显示字符串+该向量其余部分的所有零。 >
v = zeros(UInt8, 10)
v[1:5] = Vector{UInt8}("hello")
String(v)
输出为“ hello \ 0 \ 0 \ 0 \ 0 \ 0”。
我打包错了或者读错了。有什么想法吗?
答案 0 :(得分:3)
我使用以下代码段:
"""
nullstring(Vector{UInt8})
Interpret a vector as null terminated string.
"""
nullstring(x::Vector{UInt8}) = String(x[1:findfirst(==(0), x) - 1])
尽管我敢打赌,有更快的方法可以做到这一点。
答案 1 :(得分:3)
您可以使用pubspec.yaml
:unsafe_string
,这样做无需复制,因此非常快。但是@laborg的解决方案在几乎所有情况下都更好,因为它是安全的。
如果要兼顾安全和最佳性能,则必须自己编写一个手动功能:
unsafe_string(pointer(v))
但是,你真的需要这么快的几率。
答案 2 :(得分:1)
您可以使用以下代码避免复制字节并保持安全性:
function nullstring!(x::Vector{UInt8})
i = findfirst(iszero, x)
SubString(String(x),1,i-1)
end
请注意,在调用x后,x将为空,并且返回的值为Substring
而不是String
,但是在许多情况下都没有关系。该代码比@laborg的代码进行一半的分配,并且速度稍快(大约10-20%)。雅各布的代码仍然无与伦比。