Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从julia中的字节向量读取以null结尾的字符串_Julia_C Strings_Null Terminated - Fatal编程技术网

从julia中的字节向量读取以null结尾的字符串

从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

我有一个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 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”