Я пытаюсь преобразовать шестнадцатеричные значения массива в символы другого. Вот единственный способ, который я смог найти, но он не работает.
Спасибо за помощь !
char tmp[] = {0x81, 0x00, 0x00, 0x00, 0x12, 0x05};
char new[12];
for (int i = 0; i < 6; i++) {
printf(" %x", tmp[i]);
sprintf(new + i, "%x", tmp[i]);
}
for (int i = 0; i < 12; i++) {
printf(" %c", new[i]);
}
printf("new: %s\n", new);
Вот результат:
81 0 0 0 12 5
8 0 0 0 1 5
new: 800015
Значит, ему не хватает некоторых байтов...
Какой результат вы ожидаете?
sprintf(tmp + i, "%x", tmp[i]); приведет к неопределенное поведение. Вы пытаетесь записать многосимвольную строку в один символ. Не говоря уже о том, что использование tmp[i] в качестве аргумента и назначения также является UB в соответствии со спецификацией C.
Для преобразования двоичного кода в шестнадцатеричный ASCII в Интернете уже размещены тысячи фрагментов кода, например: stackoverflow.com/a/54129120/584518
Ваше редактирование мало что меняет: вы по-прежнему записываете многосимвольную строку в односимвольный new[i]. Также обратите внимание, что если char подписан (он может быть подписан или не подписан, это деталь реализации (компилятора)), то 0x81 приведет к расширение знака, поскольку считается отрицательным значением. Используйте uint8_t из <stdint.h> для общих байтов без знака. И, пожалуйста, узнайте о дополнение до двух (это наиболее распространенный способ обработки отрицательных значений).





наверное
char tmp[] = {0x81, 0x00, 0x00, 0x00, 0x12, 0x05};
char new[6];
должно быть
int tmp[] = {0x81, 0x00, 0x00, 0x00, 0x12, 0x05};
char new[6*2+1];
и
sprintf(tmp + i, "%x", tmp[i]);
должно быть
sprintf(new + 2*i, "%02x", tmp[i]);
и
for (int i = 0; i < 6; i++) {
printf(" %c", new[i]);
}
должно быть
for (int i = 0; i < 6*2; i++) {
printf(" %c", new[i]);
}
Исполнение :
/tmp % ./a.out
81 0 0 0 12 5 8 1 0 0 0 0 0 0 1 2 0 5new: 810000001205
Под валгринд :
/tmp % valgrind ./a.out
==15557== Memcheck, a memory error detector
==15557== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==15557== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==15557== Command: ./a.out
==15557==
81 0 0 0 12 5 8 1 0 0 0 0 0 0 1 2 0 5new: 810000001205
==15557==
==15557== HEAP SUMMARY:
==15557== in use at exit: 0 bytes in 0 blocks
==15557== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==15557==
==15557== All heap blocks were freed -- no leaks are possible
==15557==
==15557== For counts of detected and suppressed errors, rerun with: -v
==15557== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
@ user694733 вы правы, я вижу после, я отредактировал свой ответ
ИМО по-прежнему не имеет причин использовать такую громоздкую функцию, как sprintf, для чего-то довольно тривиального, подобного этому.
@Lundin lol Я согласен, я только что исправил ошибки из исходного определения ^^
@Lundin Как ты обходишься без sprintf?
@GaelG Я разместил ссылку на фрагмент в качестве комментария под вашим вопросом.
@Lundin Хорошо, большое спасибо за помощь. Я закрываю билет.
Что вы имеете в виду под "персонажами". ASCII-представление шестнадцатеричных значений? Но у вас всего 6 байт, так что это не подходит. Вы также используете sprintf для записи в тот же массив, что и цель...