【问题标题】:C++ : String to Character Array conversion (non-Ascii characters removed)C++:字符串到字符数组的转换(非 Ascii 字符被移除)
【发布时间】:2023-03-30 19:55:01
【问题描述】:

我有一个有效负载字符串,我想将其转换为字符数组,然后从中删除任何非 ASCII 字符。这是我的代码:

bool invalidChar (char c) 
{  
    return !(c>=0 && c <256);   
} 
void stripUnicode(string &str) 
{ 
    str.erase(remove_if(str.begin(),str.end(), invalidChar), str.end());  
}

Payload_input 是一个由 ascii 和非 ascii 字符组成的字符串:

 stripUnicode(Payload_input) ;

     char input[Payload_input.length()];
    strcpy(input,Payload_input.c_str());



    char chunk1[Payload_input.length()];
    int counter1=0;

for(counter1=0; counter1< size; counter1++)
{
        chunk1[counter1]=input[counter1];
}

现在,这是我要转换为 char 数组的字符串有效负载:

--90B452BFFF3F395ABDC878D8BEDBD152
Content-Disposition: form-data; name="uploaddir"

language/2BB5B9330E/C/
--90B452BFFF3F395ABDC878D8BEDBD152
Content-Disposition: form-data; name="filename"; filename="lottery[1]20110727082525.jpg"
Content-Type: text/plain
Content-Transfer-Encoding: binary

JFIFddDucky<http://ns.adobe.com/xap/1.0/<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>

在上面的字符串中,Content-Transfer-Encoding: binary之后的几个字符出现在linux终端上的块中(在块内写为0001等)。

当我在从字符串中剥离非 ASCII 字符后尝试打印字符 (cout Content-Transfer-Encoding: binary 行之后甚至会省略一些 ASCII 字符>.

如果我的代码有问题,请指出?

【问题讨论】:

  • 只是一个小想法:ASCII 使用 7 位。也许你的 char 应该在 0
  • 我想满足所有扩展的 ASCII 字符。

标签: c++


【解决方案1】:

问题在于,在 Linux 上,char 始终在 -128-127 范围内,因此您的 invalidChar 函数将返回 true 以获取所有不严格 ASCII 的字符。如果你想检查扩展的 ASCII (0-255) 那么你的函数是没用的:每个char 值都在扩展的 ASCII 集中;但是,由于 char 已签名,您需要检查负值。

【讨论】:

  • char 并不总是签名的。它取决于平台。
  • 对,但他谈到了 Linux。我会编辑我的答案
  • 那我需要把ASCII字符检查的范围从-127改成0再从0改成127吗??
  • 字符串是一个字符数组。一个 char 可以有一个从 -128 到 127 的值(在 Linux 上)。它本质上是一个字节,如果你不关心符号的话。扩展的 ASCII 集是标准 ASCII(包括值从 0 到 127 的字符)加上 128-255 范围内的其他字符(如果您将其作为有符号字符,则为 -128 到 -1)。因此,您的 Payload_input 已经包含扩展 ASCII 集中的字符,无法过滤它,因为根据定义 char(在大多数操作系统下)涵盖了所有扩展 ASCII 集,不多也不少。
  • 否:标准 ASCII 为 0-127,扩展为 0-255。 char(在大多数操作系统中)是一个符号,覆盖范围 -128-+127。如果将有符号字符转换为无符号字符,则会得到 0-255 的范围,这与扩展 ASCII 相同。所以,char 的正值在标准 ASCII 范围内,正负将覆盖整个扩展 ASCII
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2015-03-29
相关资源
最近更新 更多