我有一个指向十六进制格式数据的const char*,我需要找到我正在检查的NUL-终止符的数据长度,但是当\x00出现时,它会检测到它是返回错误长度的NUL-终止符。
我怎样才能避开那件事?

const char* orig = "\x09\x00\x04\x00\x02\x00\x10\x00\x42\x00\x02\x00\x01\x80\x0f\x00"
uint64_t get_char_ptr_len(const char *c)
{
    uint64_t len = 0;
    if (*c)
    {
        while (c[len] != '\0') {
            len++;
        }
    }
    return len;
}

最佳答案

\x00是NUL终止符;实际上,\x00只是编写\0的另一种方式。
如果您有包含嵌入NUL的字节数据,则不能使用NUL作为结束符,句点;您必须同时保留指向数据和数据大小的指针,就像操作“原始字节”(如memcpyfwrite)的函数一样。
至于文本,请确保初始化一个数组(而不仅仅是获取指向它的指针),以便能够使用sizeof检索它的大小:

const char orig[] = "\x09\x00\x04\x00\x02\x00\x10\x00\x42\x00\x02\x00\x01\x80\x0f\x00";

现在,您可以使用sizeof(orig)来获取它的大小(它将比显式写入的字符数长一个,因为在末尾有隐式的NUL终止符);不过,要小心,因为数组在几乎所有可用的情况下都会衰减为指针,特别是在传递给函数时。

关于c - 区分嵌入式NUL和NUL终结器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50787121/

10-11 22:13