字符串连接" \ x"十六进制角色逃脱

时间:2015-11-30 07:16:09

标签: c string

如何创建一个包含多个'\x41'或任意'\xnn'字符串的字符串,例如来自某些字符串的副本:

char * string1 = "4141414141414141";char * string2 = "bde54d7ee10a2122";

我希望我char * string3成为:    char * string3 = "\xbd\xe5\x4d\x7e\xe1\x0a\x21\x22";char * string3 = "\x41\x41\x41\x41\x41\x41\x41\x41";

以下是我要尝试的代码,但它不起作用。

char * string1 = "4141414141414141";
char c;
char * slash_x = "\\x";
int len = strlen(string1);
char * string3 = (char *) malloc(9);
for (i = 0; i < len; i++) {
    if (0 == i % 2) {
        printf("start\n");
        j = i;
        strcat(salt_empty, slash_x);
        c = string[j];
        printf("%c\n", c);
        strncat(salt_empty, &c, 1);
        j++;
        c = string[j];
        printf("%c\n", c);
        strncat(salt_empty, &c, 1);
    }
}
printf("%s\n", string3);

因此,在控制台上string3的输出将为"\x41\x41\x41\x41\x41\x41\x41\x41"而不是"AAAAAAAA"

如何修复代码以获取"AAAAAAAA"

如果string1为"bde54d7ee10a2122",则控制台的string3输出为��M~ !"

3 个答案:

答案 0 :(得分:2)

您无法通过从源表单重新解释字符串来转换字符串。改为使用它(低效但简单):

char *string1 = "4141414141414141";
int i, j, len = strlen(string1) & ~1;
char string3[len / 2 + 1];
for (i = j = 0; i < len; i += 2, j++) {
    char buf[3];
    memcpy(buf, string1 + i, 2);
    buf[2] = '\0';
    string3[j] = strtol(buf, NULL, 16);
}
string3[j] = '\0';
printf("%s\n", string3);

答案 1 :(得分:1)

你想:

char string1[] = {0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0};

答案 2 :(得分:0)

对于源字符串中的每对字符,确定对中每个字符的十六进制值,将它们组合起来以得到编码字符,然后将结果存储在目标字符串中。