繁体   English   中英

为什么 strlen() function 没有返回十六进制字符串的正确长度?

[英]Why the strlen() function doesn't return the correct length for a hex string?

我有一个十六进制字符串,例如\xF5\x17\x30\x91\x00\xA1\xC9\x00\xDF\xFF ,当尝试使用strlen() function 获取该十六进制字符串的长度时,它返回 4!

const char string_[] = { "\xF5\x17\x30\x91\x00\xA1\xC9\x00\xDF\xFF" };
unsigned int string_length = strlen(string_);
printf("%d", string_length); // the result: 4

strlen() function 是将该十六进制作为字符串处理,还是我不清楚?

对于 C 标准库中的字符串函数,值为零的字符(也称为空字符)标记字符串的结尾。 您的字符串包含\x00 ,它指定一个空字符,因此字符串在那里结束。 它前面有四个非空字符,因此strlen返回四个。

C 2018 7.1.1 1 说:

字符串是由第一个空字符终止并包括第一个空字符的连续字符序列……字符串的长度是空字符之前的字节数……

C 2018 7.24.6.3 2 说:

strlen函数计算s [它的第一个参数] 指向的字符串的长度。

您可以将数组的大小计算为sizeof string_ (因为它是char的数组)或sizeof string_ / sizeof *string_ (计算元素的数量而不考虑类型),但这将包括一个终止空字符,因为定义了一个数组[]并让长度从字符串文字初始值设定项计算,包括字符串文字的终止空字符。 您可能需要对数组的长度进行硬编码,可能使用#define来定义预处理器宏,并在数组定义和其他需要该长度的地方使用该长度。

strlen()迭代到\0 (类似于\x0 )。 然后它只计算"\xF5\x17\x30\x91" ,它是四个字符。

这是因为你在索引[4]有零

string_[0] == 0xF5
string_[1] == 0x17
string_[2] == 0x30
string_[3] == 0x91
string_[4] == 0
...

"\xf5"将具有数值0xf5char放在位置[0]

要将其视为字符串,您需要转义\字符

const char string_[] = "\\xF5\\x17\\x30\\x91\\x00\\xA1\\xC9\\x00\\xDF\\xFF";

在编译时,您的“字符串”显示为一对引号内用 C 语法表示的连续十六进制值。

strlen()是一个运行时函数,它扫描一系列字节,寻找零值字节的第一个实例。

理解“编译时”和“运行时”之间的区别是很好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM