Как безопасно перенести данные с неподписанного символа * на символ *?

Я готов передать данные из хеша без знака [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.

Другие вопросы по тегам