从julia中的字节向量读取以null结尾的字符串
我有一个UInt8类型的向量,固定长度为10。我认为它包含一个以null结尾的字符串,但当我使用字符串(v)时,它会显示字符串+向量其余部分的所有零从julia中的字节向量读取以null结尾的字符串,julia,c-strings,null-terminated,Julia,C Strings,Null Terminated,我有一个UInt8类型的向量,固定长度为10。我认为它包含一个以null结尾的字符串,但当我使用字符串(v)时,它会显示字符串+向量其余部分的所有零 v = zeros(UInt8, 10) v[1:5] = Vector{UInt8}("hello") String(v) 输出为“hello\0\0\0\0\0” 要么我把它包装错了,要么我把它看错了。有什么想法吗?我用这个片段: """ nullstring(Vector{UInt8}) Interpret a vector as
v = zeros(UInt8, 10)
v[1:5] = Vector{UInt8}("hello")
String(v)
输出为“hello\0\0\0\0\0”
要么我把它包装错了,要么我把它看错了。有什么想法吗?我用这个片段:
"""
nullstring(Vector{UInt8})
Interpret a vector as null terminated string.
"""
nullstring(x::Vector{UInt8}) = String(x[1:findfirst(==(0), x) - 1])
尽管我打赌有更快的方法来实现这一点。您可以使用
不安全字符串:不安全字符串(指针(v))
,这样做不需要拷贝,所以速度非常快。但是@laborg的解决方案在几乎所有情况下都更好,因为它是安全的。
如果您想要安全性和最大性能,您必须自己编写手动功能:
function get_string(v::Vector{UInt8})
# Find first zero
zeropos = 0
@inbounds for i in eachindex(v)
iszero(v[i]) && (zeropos = i; break)
end
iszero(zeropos) && error("Not null-terminated")
GC.@preserve v unsafe_string(pointer(v), zeropos - 1)
end
但是,呃,你真的需要这么快的几率有多大。你可以通过以下代码避免复制字节并保护安全:
function nullstring!(x::Vector{UInt8})
i = findfirst(iszero, x)
SubString(String(x),1,i-1)
end
请注意,调用后x将为空,返回值为Substring
而不是String
,但在许多情况下,这并不重要。这段代码的分配比@laborg的代码快一半,并且略快一些(大约10-20%)。雅各伯的代码仍然是不可攻击的。< /P>得到的字符串由10字节的数组支持,包括所有的零(朱丽亚字符串更像C++中的字符串,而不是C、IIUC中的字符串)。那么你真正期望的是什么呢<代码>“你好”
<代码>“你好\0”
?