区分嵌入式 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"(例如 memcpy
或 fwrite
)进行操作的函数一样。
至于文字,确保你初始化了一个 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);
我有一个 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"(例如 memcpy
或 fwrite
)进行操作的函数一样。
至于文字,确保你初始化了一个 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);