Как преобразовать '\\ x41' в '\ x41' в c? - PullRequest
0 голосов
/ 06 июня 2019

Возможно, на этот вопрос уже был дан ответ, но, к сожалению, многие попытки не сработали: (

Точно сказал, давайте предположим, что у меня есть:

char buf[] = "\\x41\\x41\\x41\\x41"

В основном я хочучтобы преобразовать его в

char con[] = "\x41\x41\x41\x41"

Я попытался разбить buf на массивы, такие как:

buf1[]="41",buf2[]="41", buf3[]="41", buf4[]="41"
char newbuf[30];
sprintf(newbuf, "%2x%2x%2x%2x", buf1,buf2,buf3,buf4);
printf("%s:%llx:%p:%d",newbuf,newbuf,newbuf, strlen(newbuf))

и получаю вывод: ffffe3f0ffffe410ffffe430ffffe450ffffe470ffffe490:7fffffffe3b0:0x7fffffffe3b0:48

Новывод, который я хочу увидеть, это AAAA

Так что, я чего-то упускаю или делаю неправильно?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Попробуйте это:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void parseCstring(const char buf[], char con[])
{
    int i=0, j=0;
    unsigned char x;
    while ( (x = buf[i]) != '\0')
    {
        if ( (x=='\\') && (buf[i+1]=='x') && (isxdigit(buf[i+2])) && (isxdigit(buf[i+3])) )
        {
            unsigned int val;
            sscanf(&(buf[i+2]),"%2x", &val);
            x=(unsigned char)val;
            i+=3;
        }
        con[j++]=x;
        i++;
    }
}

int main()
{
    char buf[] = "\\x41\\x42\\x42\\x41 was great\\x21";
    char con[40];
    printf("%s\n",buf);
    parseCstring(buf, con);
    printf("%s\n",con);
    return 0;
}
0 голосов
/ 06 июня 2019

sscanf может сделать это.отсканируйте \x, затем отсканируйте двузначное шестнадцатеричное целое, используя %2hhx, чтобы сохранить отсканированное значение в char.
char con[sizeof buf], равное con тому же размеру, что и buf.Поскольку четыре символа в buf станут одним символом в con, это более чем достаточно памяти.Инициализация с = ""; установит все символы в con на ноль.

#include <stdio.h>

int main ( void) {
    char buf[] = "\\x41\\x41\\x41\\x41";
    char con[sizeof buf] = "";

    sscanf ( buf, "\\x%2hhx\\x%2hhx\\x%2hhx\\x%2hhx", &con[0], &con[1], &con[2], &con[3]);
    printf ( "%s\n", con);

    return 0;
}

sprintf можно использовать, но это немного сложнее.
Строка 41 должна быть преобразована в шестнадцатеричное значение.strtol может сделать это.
Затем сохранить это значение в символе %c

#include <stdio.h>
#include <stdlib.h>

int main ( void) {
    char buf[] = "\\x41\\x41\\x41\\x41";
    char con[sizeof buf] = "";

    sprintf ( con, "%c%c%c%c"
    , (char) strtol ( &buf[2], NULL, 16)
    , (char) strtol ( &buf[6], NULL, 16)
    , (char) strtol ( &buf[10], NULL, 16)
    , (char) strtol ( &buf[14], NULL, 16));
    printf ( "%s\n", con);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...