【发布时间】:2020-12-06 02:52:32
【问题描述】:
我正在努力解决我在尝试使用字符串中的按位子字符串时遇到的问题。在下面的示例中,这个简单的小函数对值 0-127 执行了应有的操作,但如果我尝试使用大于 127 的 ASCII 值,则会失败。我认为这是因为字符串本身已签名。但是,如果我将其设为无符号,我不仅会遇到问题,因为显然strlen() 不会对无符号字符串进行操作,而且我会收到警告说它是一个多字符常量。为什么是多个字符?我想我已经尝试了一切。我可以做些什么来使这个值> 127?
#include <iostream>
#include <cstring>
const unsigned char DEF_KEY_MINOR = 0xAD;
const char *buffer = { "jhsi≠uhdfiwuui73" };
size_t isOctetInString(const char *buffer, const unsigned char octet)
{
size_t out = 0;
for (size_t i = 0; i < strlen(buffer); ++i)
{
if(!(buffer[i] ^ octet))
{
out = i;
break;
}
}
return out;
}
int main() {
std::cout << isOctetInString(buffer, 'i') << "\n";
std::cout << isOctetInString(buffer, 0x69) << "\n";
std::cout << isOctetInString(buffer, '≠') << "\n";
std::cout << isOctetInString(buffer, 0xAD) << "\n";
return 0;
}
输出
3
3
0
0
编辑
基于 cmets,我尝试了一些不同的方法,包括将八位字节和缓冲区转换为 unsigned int 和 wchar_t,以及从八位字节参数类型中删除 unsigned char。有了这些,我得到的输出是
3
3
6
0
我什至尝试将缓冲区中的 ≠ char 替换为
const char *buffer = {'0xAD', "jhsiuhdfiwuui73"};
但是我仍然收到有关多字节字符的警告。
正如我之前所说,我主要关心的是能够在字符串中找到位序列 0xAD,但我现在看到使用 ascii 字符或任何使用 ascii 字符集的构造都会导致问题。由于0xAD 只有 8 位,所以一定有办法做到这一点。有谁知道这样做的方法吗?
【问题讨论】:
-
ASCII 是 7 位编码,因此没有 ASCII 值 >127。
≠在 .cpp 文件中的编码和解释方式取决于您使用的文本编辑器和编译器。 -
我实际上只关心位。我只是想测试算法。该符号可能不可移植,但这是该环境的正确符号。
-
然后只强制比较单个字节
(unsigned char)buffer[i] == (unsigned char)octet。但是,关于“multi-char constant”的警告表明可能涉及其他一些多字节编码,可能是 UTF-8。 -
buffer和octet都需要签名(或两者都未签名)。否则,0xAD的符号扩展将给出0xFFFFFFAD(有符号,32 位整数)和0x000000AD(无符号,32 位整数)。对这些进行异或运算将得到0xFFFFFF00。 -
如果在您的平台上
char被签名,则设置高位时的实际值将在-128 和-1 之间。用 128 到 255 之间的数字对此类值进行异或运算永远不会给出 0。
标签: c++ string search substring bit-manipulation