这段与 char 字符串相关的 C++ 代码有什么作用?
What does this char string related piece of C++ code do?
bool check(const char *text) {
char c;
while (c = *text++) {
if ((c & 0x80) && ((*text) & 0x80)) {
return true;
}
}
return false;
}
什么是0x80
以及整个神秘函数的作用是什么?
测试 non-zero 的 x & 0x80
表达式的结果(在您显示的代码中做了两次)检查 char
的最高有效位(第 7 位)操作数 (x
) 设置为 1。在您的情况下,代码循环遍历给定的字符串以查找两个 连续的 字符(c
,它是 'current' 字符的副本,以及 *test
,下一个)设置了那个位。
如果找到这样的组合,函数returns true
;如果未找到且循环到达 nul
终止符(因此 c = *text++
表达式变为零),则它 returns false
.
至于为什么它做这样的检查——我只能猜测但是,如果高位是设置,那么字符不会是标准的 ASCII 值(并且 可能 是 Unicode 对中的第一个,或其他一些 multi-byte 字符表示形式)。
可能有用的参考资料:
1 请注意,这种按位与测试确实是检查该位的唯一 安全 方法,因为 C++ 标准允许 char
类型为 signed
(测试负值是替代方法)或 unsigned
(需要测试 >= 128);如果实现的 char
具有 'wrong' 类型的签名,那么这些测试中的任何一个都会失败。
如果没有更多上下文,我无法完全确定,但在我看来,此函数会检查字符串是否包含经典 7 位 US-ASCII 范围之外的任何 UTF-8 字符。
while (c=*text++)
将循环直到在 C-style 字符串中找到 nul-terminator;将每个 char
分配给 c
。 c & 0x80
检查是否设置了 c
的 most-significant-bit。 *text & 0x80
对 text
指向的 char
做同样的事情(这将是 c
之后的那个,因为它是作为 while
条件的一部分递增的).
因此,如果 text
指向的字符串中任意两个相邻的 char
设置了 most-significant-bit,则此函数将 return true
。 UTF-8 中任何代码点 U+0080 及以上都是这种情况;因此我猜这个函数是用来检测UTF-8文本的。
改写得不那么紧凑:
while (true)
{
char c = *text;
text += 1;
if (c == '[=10=]') // at the end of string?
return false;
int temp1 = c & 0x80; // test MSB of c
int temp2 = (*text) & 0x80; // test MSB of next character
if (temp1 != 0 && temp2 != 0) // if both set the return true
return true;
}
MSB 表示最高有效位。 Bit7.纯 ascii 字符为零
bool check(const char *text) {
char c;
while (c = *text++) {
if ((c & 0x80) && ((*text) & 0x80)) {
return true;
}
}
return false;
}
什么是0x80
以及整个神秘函数的作用是什么?
测试 non-zero 的 x & 0x80
表达式的结果(在您显示的代码中做了两次)检查 char
的最高有效位(第 7 位)操作数 (x
) 设置为 1。在您的情况下,代码循环遍历给定的字符串以查找两个 连续的 字符(c
,它是 'current' 字符的副本,以及 *test
,下一个)设置了那个位。
如果找到这样的组合,函数returns true
;如果未找到且循环到达 nul
终止符(因此 c = *text++
表达式变为零),则它 returns false
.
至于为什么它做这样的检查——我只能猜测但是,如果高位是设置,那么字符不会是标准的 ASCII 值(并且 可能 是 Unicode 对中的第一个,或其他一些 multi-byte 字符表示形式)。
可能有用的参考资料:
1 请注意,这种按位与测试确实是检查该位的唯一 安全 方法,因为 C++ 标准允许 char
类型为 signed
(测试负值是替代方法)或 unsigned
(需要测试 >= 128);如果实现的 char
具有 'wrong' 类型的签名,那么这些测试中的任何一个都会失败。
如果没有更多上下文,我无法完全确定,但在我看来,此函数会检查字符串是否包含经典 7 位 US-ASCII 范围之外的任何 UTF-8 字符。
while (c=*text++)
将循环直到在 C-style 字符串中找到 nul-terminator;将每个 char
分配给 c
。 c & 0x80
检查是否设置了 c
的 most-significant-bit。 *text & 0x80
对 text
指向的 char
做同样的事情(这将是 c
之后的那个,因为它是作为 while
条件的一部分递增的).
因此,如果 text
指向的字符串中任意两个相邻的 char
设置了 most-significant-bit,则此函数将 return true
。 UTF-8 中任何代码点 U+0080 及以上都是这种情况;因此我猜这个函数是用来检测UTF-8文本的。
改写得不那么紧凑:
while (true)
{
char c = *text;
text += 1;
if (c == '[=10=]') // at the end of string?
return false;
int temp1 = c & 0x80; // test MSB of c
int temp2 = (*text) & 0x80; // test MSB of next character
if (temp1 != 0 && temp2 != 0) // if both set the return true
return true;
}
MSB 表示最高有效位。 Bit7.纯 ascii 字符为零