Преобразование Hexdump в строку в c

Есть ли способ преобразовать шестнадцатеричный дамп, например. aec4d2f3c6a4e70ea6cea074f65812d2a34b180cc92b817edcd867167e7a91c5beb942f0 в строку в c, чтобы каждые две шестнадцатеричные цифры составляли char? Если да, то?


person Leo Izen    schedule 15.01.2011    source источник
comment
Только что расшифровал строку char *str = Кто-то сделает мою домашнюю работу еще на несколько повторений :-);   -  person Breaking not so bad    schedule 15.01.2011
comment
Вы можете преобразовать шестнадцатеричный дамп в массив байтов. Вы не обязательно можете преобразовать его в строку. Что делать, если у вас есть байт 0x00? Или байты, которые недопустимы в вашей кодировке символов?   -  person dan04    schedule 15.01.2011


Ответы (3)


Читает со стандартного ввода и выводит на стандартный вывод:

int main() 
{
    int ch;
    while(scanf("%2x", &ch) == 1)
        putchar(ch);
}

Я думаю, вы можете легко изменить его самостоятельно для ваших конкретных требований к источнику и месту назначения.

person Yakov Galka    schedule 15.01.2011

Один из способов:

size_t unBytes = strHex.size() / 2;
std::string strResult(unBytes, 0);
for (size_t i = 0; i < unBytes; ++i)
{
    std::istringstream in(strHex.substr(2*i, 2));
    int byte = 0;
    in >> std::hex >> byte;
    strResult[i] = byte;
}
person ssmir    schedule 15.01.2011
comment
Вы меня поняли - я не могу понять, шутка ли это. - person j_random_hacker; 15.01.2011
comment
@j_random_hacker: Это C++ =) конечно, его можно сделать намного короче и быстрее. Я просто скопировал это из одной из моих программ - person ssmir; 15.01.2011
comment
@Наваз Спасибо. Первоначально unStart и unEnd имели некоторые смещения - person ssmir; 15.01.2011
comment
@ssmir: хорошо. Я понимаю, что istringstream требует вызова substr() (в идеальном мире у него был бы конструктор, принимающий пару итераторов, что позволило бы избежать этого, но это не ваша вина), но, пожалуйста, по крайней мере, предварительно выделите достаточно места в strResult и используйте strResult[i] = byte; напрямую, а не чем расточительно идти через encoded. Вам вообще не нужен encoded. - person j_random_hacker; 15.01.2011
comment
@j_random_hacker Спасибо. Изначально мне нужен был этот вектор, а сейчас - нет. - person ssmir; 15.01.2011
comment
@ssmir: Это выглядит намного здоровее :) - person j_random_hacker; 15.01.2011

Несколько раз используйте scanf с %hhx. См. man scanf.

person ypnos    schedule 15.01.2011