检查 char 是否以 \xHH 表示法写入
Check if char is written in \xHH notation
我正在尝试将此输入 \x01\xc3\xa4\xc3\xb6\xc3\xbc\xff
转义为此 \x01\xc3\xa4\xc3\xb6\xc3\xbc\xff
以使用 printf("%s",input)
打印出来。通常我必须转义各种输入,还需要使用 \t、\n 等转义序列...
为此,我编写了以下函数:
void kvstr_escape_string(char* dest, const KV_Buffer* src)
{
char c;
int i = 0;
const char* data = src->data; // src->data is a char*
while (src != NULL && i < src->length && (c = *(data++))) {
switch(c) {
case '\a':
*(dest++) = '\';
*(dest++) = 'a';
break;
case '\b':
*(dest++) = '\';
*(dest++) = 'b';
break;
case '\t':
*(dest++) = '\';
*(dest++) = 't';
break;
case '\n':
*(dest++) = '\';
*(dest++) = 'n';
break;
case '\v':
*(dest++) = '\';
*(dest++) = 'v';
break;
case '\f':
*(dest++) = '\';
*(dest++) = 'f';
break;
case '\r':
*(dest++) = '\';
*(dest++) = 'r';
break;
case '\':
*(dest++) = '\';
break;
case '\"':
*(dest++) = '\';
*(dest++) = '\"';
break;
case '\x01':
*(dest++) = '\';
*(dest++) = 'x';
*(dest++) = '0';
*(dest++) = '1';
break;
// Here i need something to handle \xHH
default:
*(dest++) = c;
}
i++;
}
*(dest++) = '[=10=]';
}
我的问题是在 case '\x01':
的情况下如何处理我的函数中显示的所有不同的 \xHH 输入?我应该使用正则表达式吗?
[更新]看看卡雷尔的回答。如果您想知道默认块应该是什么样子,这里有一个例子:
default:
if (c < 32 || c > 126){
*(dest++) = '\';
*(dest++) = 'x';
sprintf(d, "%.2x", c);
*(dest++) = d[0];
*(dest++) = d[1];
}else{
*(dest++) = c;
}
您的代码
case '\x01':
*(dest++) = '\';
*(dest++) = 'x';
*(dest++) = '0';
*(dest++) = '1';
break;
基本上只是用来匹配值为 1 的文字字节。您也可以将其写为
case 1:
...
我会将此块移动到 default
情况并匹配 c
是否为 31 或更小(32 是 space)。此外,您可能希望转义 ASCII 值大于 126 的字符,波浪号。在我的脑海中:
default:
if (c < 32 || c > 126)
// add "\x" followed by two hex digits of the value of c
else
// simply add the value of c
至于将一个值转换为两个十六进制字符,我会使用一个小的转换缓冲区和 sprintf()
。希望这对您有所帮助!
我正在尝试将此输入 \x01\xc3\xa4\xc3\xb6\xc3\xbc\xff
转义为此 \x01\xc3\xa4\xc3\xb6\xc3\xbc\xff
以使用 printf("%s",input)
打印出来。通常我必须转义各种输入,还需要使用 \t、\n 等转义序列...
为此,我编写了以下函数:
void kvstr_escape_string(char* dest, const KV_Buffer* src)
{
char c;
int i = 0;
const char* data = src->data; // src->data is a char*
while (src != NULL && i < src->length && (c = *(data++))) {
switch(c) {
case '\a':
*(dest++) = '\';
*(dest++) = 'a';
break;
case '\b':
*(dest++) = '\';
*(dest++) = 'b';
break;
case '\t':
*(dest++) = '\';
*(dest++) = 't';
break;
case '\n':
*(dest++) = '\';
*(dest++) = 'n';
break;
case '\v':
*(dest++) = '\';
*(dest++) = 'v';
break;
case '\f':
*(dest++) = '\';
*(dest++) = 'f';
break;
case '\r':
*(dest++) = '\';
*(dest++) = 'r';
break;
case '\':
*(dest++) = '\';
break;
case '\"':
*(dest++) = '\';
*(dest++) = '\"';
break;
case '\x01':
*(dest++) = '\';
*(dest++) = 'x';
*(dest++) = '0';
*(dest++) = '1';
break;
// Here i need something to handle \xHH
default:
*(dest++) = c;
}
i++;
}
*(dest++) = '[=10=]';
}
我的问题是在 case '\x01':
的情况下如何处理我的函数中显示的所有不同的 \xHH 输入?我应该使用正则表达式吗?
[更新]看看卡雷尔的回答。如果您想知道默认块应该是什么样子,这里有一个例子:
default:
if (c < 32 || c > 126){
*(dest++) = '\';
*(dest++) = 'x';
sprintf(d, "%.2x", c);
*(dest++) = d[0];
*(dest++) = d[1];
}else{
*(dest++) = c;
}
您的代码
case '\x01':
*(dest++) = '\';
*(dest++) = 'x';
*(dest++) = '0';
*(dest++) = '1';
break;
基本上只是用来匹配值为 1 的文字字节。您也可以将其写为
case 1:
...
我会将此块移动到 default
情况并匹配 c
是否为 31 或更小(32 是 space)。此外,您可能希望转义 ASCII 值大于 126 的字符,波浪号。在我的脑海中:
default:
if (c < 32 || c > 126)
// add "\x" followed by two hex digits of the value of c
else
// simply add the value of c
至于将一个值转换为两个十六进制字符,我会使用一个小的转换缓冲区和 sprintf()
。希望这对您有所帮助!