检查char是否以\ xHH表示法编写

时间:2015-01-05 08:58:40

标签: c escaping hex

我试图将此输入\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++) = '\0';
}

我的问题是如何在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;
        }

1 个答案:

答案 0 :(得分:1)

您的代码

case '\x01':
    *(dest++) = '\\';
    *(dest++) = 'x';
    *(dest++) = '0';
    *(dest++) = '1';
    break;

基本上只是意味着将值为1的文字字节匹配。您也可以将其写为

case 1:
    ...

我会将此块移动到default情况,并匹配c是否为31或更小(32为空格)。此外,您可能希望转义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()。希望这有帮助!