区分嵌入式NUL和NUL终结符

时间:2018-06-10 19:04:22

标签: c pointers nul

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

2 个答案:

答案 0 :(得分:2)

\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终结符);但是要小心,因为数组在几乎所有可用场合都会衰减指针,特别是在传递给函数时。

答案 1 :(得分:0)

var tree; function setup() { noCanvas(); tree = new Tree(); tree.addValue(5); tree.addValue(3); console.log(tree); } function Tree() { this.root = null; } Tree.prototype.addValue = function (val) { var n = new Node(val); if (this.root == null) { this.root = n; } else { this.root.addNode(n); } } Tree.prototype.addNode = function (n) { if (n.value < this.value) if (this.left == null) { this.left = n; } else { this.left.addNode(n); } } else if (n.value > this.value) { if (this.right == null) { this.right = n; } else { this.right.addNode(n); } } } function Node(val) { this.value = val; this.left = null; this.right = null; } 表示十六进制表示法。

查看ASCII table以查看\ x00代表的内容。

\x

\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";