区分嵌入式 NUL 和 NUL 终止符

Differentiating between embedded NUL and NUL-terminator

我有一个 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] != '[=10=]') {
            len++;
        }
    }
    return len;
}

\x00 的NUL终结符;事实上,\x00 只是 [=13=].

的另一种写法

如果您的字节数据包含嵌入的 NUL,则不能将 NUL 用作终止符、句点;您必须同时保留指向数据的指针和数据大小,就像对 "raw bytes"(例如 memcpyfwrite)进行操作的函数一样。

至于文字,确保你初始化了一个 array(而不是仅仅获取指向它的指针)以便能够使用 sizeof 检索它的大小:

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

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

\x表示十六进制。

查看 ASCII table 以了解 \x00 代表什么。

\x00 = NULL // In Hexadecimal notation.

\x00 只是 [=15=].

的另一种写法

尝试

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

len=sizeof(orig)/sizeof(char);