【问题标题】:Differentiating between embedded NUL and NUL-terminator区分嵌入式 NUL 和 NUL 终止符
【发布时间】:2018-06-11 03:30:29
【问题描述】:

我有一个 const char* 指向十六进制格式的数据,我需要找到我正在检查的数据的长度 NUL-terminator 但是当 \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;
}

【问题讨论】:

  • 您必须将数组的长度作为附加参数传递给get_char_ptr_len。虽然这是一个重言式,因为你已经知道长度;)
  • 你不能。零就是零。
  • 知道了,我得手动获取大小并对其进行硬编码
  • 您总是可以将它包装在一个结构中以将指针和大小保持在一起。

标签: c pointers nul


【解决方案1】:

\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 终止符);不过要小心,因为数组几乎在每个可用场合都会衰减为指针,尤其是在传递给函数时。

【讨论】:

  • 我需要使用该指针获取数据的大小,NULL 终止符不能检查是否有解决方法?
  • 没有。如果您只有一个指向二进制字节数据的指针(即允许每个字节值的位置),则无法确定其长度。
  • @AamirShaikh:NUL,不是 NULL。 NULL 是一个空 指针 常量。
【解决方案2】:

\x 表示十六进制。

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

\x00 = NULL // In Hexadecimal notation.

\x00 只是写\0 的另一种方式。

试试

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多