Как безопасно перенести данные с неподписанного символа * на символ *?
Я готов передать данные из хеша без знака [512 + 1] в char res[512 + 1] безопасно.
Моя библиотека хэширования C MHASH возвращает результат, поэтому его можно распечатать, как указано ниже.
for (int i = 0; i < size /*hash block size*/; i++)
printf("%.2x", hash[i]); // which is unsigned char - it prints normal hash characters in range [a-z,0-9]
printf("\n");
Я готов сделать что-то подобное (см. Ниже).
const char* res = (const char *)hash; // "hash" to "res"
printf("%s\n", res); // print "res" (which is const char*) - if i do this, unknown characters are printed
Я знаю разницу между char и unsigned char, но я не знаю, как передавать данные. Любой ответ будет принята с благодарностью, спасибо заранее. Но, пожалуйста, не рекомендуйте мне код C++ (STD), я работаю над проектом, не связанным с STD.
3 ответа
Предполагая следующее:
#define ARR_SIZE (512 + 1)
unsigned char hash[ARR_SIZE];
char res[ARR_SIZE];
/* filling up hash here. */
Просто делать:
#include <string.h>
...
memcpy(res, hash, ARR_SIZE);
Учитывая, что содержание unsigned char
массив - это печатаемые символы, вы всегда можете безопасно преобразовать его в char
, Либо печатная копия с memcpy, либо ссылка на указатель, как в коде, который вы уже написали.
Я предполагаю, что настоящая проблема здесь в том, что содержимое массива char без знака на самом деле не печатные символы, а целые числа в некотором формате. Вам придется конвертировать их из целых в буквы ASCII. Как это сделать, зависит от формата данных, который не понятен в вашем вопросе.
Ну, спасибо, ребята, за ваши ответы, но, к сожалению, пока ничего не получилось. Теперь я придерживаюсь кода ниже.
char res[(sizeof(hash) * 2) + 1] = { '\0' };
char * pPtr = res;
for (int i = 0; i < hashBlockSize; i++)
sprintf(pPtr + (i * 2), "%.2x", hash[i]);
return (const char *)pPtr;
До тех пор, пока не найдется какой-либо другой, более эффективный способ сделать это. Это верно, мой вопрос тесно связан с библиотекой MHASH.