如何在ascii值超过127的字符串中找到8位子字符串?

问题描述

我正在努力解决一个问题,试图解决字符串中的按位子字符串。在下面的示例中,这个简单的小函数对值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

修改

基于注释,我尝试了一些不同的操作,包括将八位字节和缓冲区强制转换为unsigned int和wchar_t,以及从八位字节参数类型中删除未签名的char。有了这些输出,我得到的都是

3
3
6
0

我什至尝试用

替换缓冲区中的≠char
const char *buffer = {'0xAD',"jhsiuhdfiwuui73"};

但是我仍然收到有关多字节字符的警告。

正如我之前说的,我主要关心的是能够找到字符串中的位序列0xAD,但是现在我看到使用ascii字符或任何使用ascii字符集的构造都会引起问题。由于0xAD只有8位,因此必须有一种方法。有人知道这样做的方法吗?

解决方法

符号扩展名- buffer [i] ^ octet 实际上是未签名的(int(buffer [i]))^ unsigned(octet)。如果要将buffer []设为无符号字符,则必须以这种方式进行定义。

,

您的问题有多种困惑来源:

  • 可以使用unsigned char完成字符串中的strchr()值搜索,该操作会将int参数和char数组中的字符都转换为{ {1}}进行比较。

  • 您的函数使用unsigned char来检测匹配项,如果对if(!(buffer[i] ^ octet))进行了签名,则该匹配项将不起作用,因为该表达式的值为char且仅对{ {1}}。一个简单的解决方案是:

    if(!((int)buffer[i] ^ (int)octet))
  • 请注意,在源代码和终端处理程序中,字符buffer[i]在目标系统上可能被编码为多个字节,例如代码点为8800或0x2260在UTF-8中编码为0xE2 0x89 0xA0。语法 if ((unsigned char)buffer[i] == octet) 会带来问题。我不确定C ++如何处理多字节字符常量,但C会接受具有实现特定值的它们。

  • 要查看系统如何处理非ASCII字节,可以将以下行添加到函数中:

    '≠'

    或更明确地说:

    main()

    在我的linux系统上,后者输出:

     ≠ is encoded as E2 89 A0 and '≠' has a value of 0xE289A0

    在我的MacBook上,编译失败并显示以下错误:

      std::cout << "≠ uses " << sizeof("≠") - 1 << "bytes\n";
      std::cout << "'≠' has the value " << (int)'≠' << "\n";
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...