Hattrick HKS
Hattrick HKS

Reputation: 43

How can I transfer data from unsigned char * to char * safely?

I am willing to transfer data from unsigned char hash[512 + 1] to char res[512 + 1] safely.

My C hashing library MHASH returns a result so it can be printed as listed below.

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");

I am willing to do something like that (see below).

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

I know the difference between char and unsigned char, but I don't know how to transfer data. Any answer would be greatly appreciated, thanks in advance. But please do not recommend me C++ (STD) code, I am working on a project that is not STD-linked.

Upvotes: 1

Views: 357

Answers (3)

alk
alk

Reputation: 70971

Assuming the following:

#define ARR_SIZE (512 + 1)

unsigned char hash[ARR_SIZE];
char res[ARR_SIZE];

/* filling up hash here. */

Just do:

#include <string.h>

...

memcpy(res, hash, ARR_SIZE);

Upvotes: 0

Hattrick HKS
Hattrick HKS

Reputation: 43

Well, thank you guys for your answers, but unfortunately nothing worked yet. I am now sticking with the code below.

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;

Until there is any other much more performant way to get this done. It's right, my question is strongly related to MHASH Library.

Upvotes: 0

Lundin
Lundin

Reputation: 214310

Given that the contents of the unsigned char array are printable characters, you can always safely convert it to char. Either a hardcopy with memcpy or a pointer reference as in the code you have already written.

I'm guessing that the actual problem here is that the unsigned char array contents are not actually printable characters, but integers in some format. You'll have to convert them from integer to ASCII letters. How to do this depends on the format of the data, which isn't clear in your question.

Upvotes: 1

Related Questions