hexlify и unhexlify функции в C - PullRequest
0 голосов
/ 31 мая 2018

Пожалуйста, помогите ... Я пытаюсь изучить преобразование типов C.

Этот код хорошо работает только при преобразовании некоторых шестнадцатеричных символов в 1, 2, 3. Для других также изменение строки или уменьшение длины строки, преобразование не удается ...

Я поставлю код ниже ... Кто-нибудь может объяснить мне, где код неверен?

Заранее спасибо!

#include <stdio.h>

int a2v(char c)
{
    if ((c >= '0') && (c <= '9'))
    {
        return c - '0';
    }
    if ((c >= 'a') && (c <= 'f'))
    {
        return c - 'a' + 10;
    }
    else return 0;
}

char v2a(int c)
{
    const char hex[] = "0123456789abcdef";
    return hex[c];
}

char *unhexlify(char *hstr)
{
    char *bstr = malloc((strlen(hstr) / 2) + 1);
    char *pbstr = bstr;
    for (int i = 0; i < strlen(hstr); i += 2)
    {
        *pbstr++ = (a2v(hstr[i]) << 4) + a2v(hstr[i + 1]);
    }
    *pbstr++ = '\0';
    return bstr;
}

char *hexlify(char *bstr)
{
    char *hstr = malloc((strlen(bstr) * 2) + 1);
    char *phstr = hstr;
    for (int i = 0; i < strlen(bstr); i++)
    {
        *phstr++ = v2a((bstr[i] >> 4) & 0xFF);
        *phstr++ = v2a((bstr[i]) & 0xFF);
    }
    *phstr++ = '\0';
    return hstr;
}

int main()
{
    char *title = "... Trying to convert hex into binary string and back again ?! ...";
    printf("%s\n\n", title);

    char *input = "0123456789abcdef\0";
    printf("Original: %s (%d)\n\n", input, (int)strlen(input));

    char *input_bin = unhexlify(input);
    printf("Bin: %s (%d)\n\n", input_bin, (int)strlen(input_bin));

    char *input_hex = hexlify(input_bin);
    printf("Hex: %s (%d)\n\n", input_hex, (int)strlen(input_hex));

    system("pause");
    return 0;
}

1 Ответ

0 голосов
/ 31 мая 2018

Спасибо!

Исходя из ответа chux , ошибка заключалась в функции hexlify:

*phstr++ = v2a((bstr[i] >> 4) & 0x0F);
*phstr++ = v2a((bstr[i]) & 0x0F);

Маски были неверными!Я изучу гораздо больше!

PS = Я добавил некоторый код для обработки двоичного символа NULL (0), который усекает строку.

#include <stdio.h>

int a2v(char c)
{
    if ((c >= '0') && (c <= '9'))
    {
        return c - '0';
    }
    if ((c >= 'a') && (c <= 'f'))
    {
        return c - 'a' + 10;
    }
    else return 0;
}

char v2a(int c)
{
    const char hex[] = "0123456789abcdef";
    return hex[c];
}

char *unhexlify(char *hstr)
{
    char *bstr = malloc((strlen(hstr) / 2) + 1);
    char *pbstr = bstr;
    for (int i = 0; i < strlen(hstr); i += 2)
    {
        char c = (a2v(hstr[i]) << 4) + a2v(hstr[i + 1]);
        if (c == 0) {
            *pbstr++ = -128;
        } else {
            *pbstr++ = c;
        }
    }
    *pbstr++ = '\0';
    return bstr;
}

char *hexlify(char *bstr)
{
    char *hstr = malloc((strlen(bstr) * 2) + 1);
    char *phstr = hstr;
    for (int i = 0; i < strlen(bstr); i++)
    {
        if (bstr[i] == -128)
        {
            *phstr++ = '0';
            *phstr++ = '0';
        } else {
            *phstr++ = v2a((bstr[i] >> 4) & 0x0F);
            *phstr++ = v2a((bstr[i]) & 0x0F);
        }   
    }
    *phstr++ = '\0';
    return hstr;
}

int main()
{
    printf("... Trying to convert hex into binary string and back again ?! ...\n\n");

    char *input = "070790ca8fd8058b455f13dd698a4eed028cb0efc13907f681604676d69e57affe299aae7c91fd000000005271266004e4cd7f52548153f8f78b76840aeca16e91bac0ebeb4d74ff3ce3c901\0";

    char *input_bin = unhexlify(input);
    char *input_hex = hexlify(input_bin);

    printf("Input: %s (%d)\n\n", input, strlen(input));
    printf("Output: %s (%d)\n\n", input_hex, strlen(input_hex));

    if (strcmp(input, input_hex) == 0)
    {
        printf("Input and output are EQUALS !\n\n");
    } else {
        printf("Input and output are NOT EQUALS !\n\n");
    }

    system("pause");
    return 0;
}

С уважением, Кевин

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