0
votes

I have a unsigned int[16] array that when printed out looks like this:

4418703544ED3F688AC208F53343AA59

The code used to print it out is this:

for (i = 0; i < 16; i++)
    printf("%X", CipherBlock[i] / 16), printf("%X",CipherBlock[i] % 16);
printf("\n");

I need to pass this unsigned int array "CipherBlock" into a decrypt() method that only takes unsigned char *. How do correctly memcpy everything from the "CipherBlock" array into an unsigned char array without losing information?

My understanding is an unsigned int is 4 bytes and unsigned char 1 byte. Since "CipherBlock" is 16 unsigned integers, the total size in bytes = 16 * 4 = 64 bytes. Does this mean my unsigned char[] array needs to be 64 in length?

If so, would the following work?

unsigned char arr[64] = { '\0' };
memcpy(arr,CipherBlock,64); 

This does not seem to work. For some reason it only copies the the first byte of "CipherBlock" into "arr". The rest of "arr" is '\0' thereafter.

3
Apparently, only the least 8 bits of each element CipherBlock[i] matter, so they are not arbitrary ints (or their 24 highest bits don't matter to you). - Basile Starynkevitch
Is your decrypt function specified to accept arbitrary zero terminated strings, or can it only accept hex string (with hex digit in ASCII)? - Basile Starynkevitch
@Basile Starynkevitch: That's the question. What are we passing in the form of an unsigned char*? (See my answer for speculations.) - aib
I think the question is inadequately specified. There are several different ways to convert or reinterpret 16 unsigned int values as a number of unsigned char values, and it's not possible to tell from the question which one you want. For example, you don't say whether you want the first unsigned char in arr to represent the most significant 8 bits of the first unsigned int, or the least significant 8 bits, or something else. It rather depends how the CipherBlock was generated and transmitted to you in the first place. - Steve Jessop
Regarding your observation that memcpy with a last argument of 64 only copies one byte -- on the face of it this is impossible, there must be some bug in the code you've left out. - Steve Jessop

3 Answers

2
votes

Why don't you just cast the CipherBlock pointer to unsigned char * and pass that?

decrypt((unsigned char *)CipherBlock);
2
votes

An int is at least 16 bits, same as a short in that regard.

It looks like every unsigned int has values 0-255 or 00-FF in your case, which is a safe range for an unsigned char. However, the proper way to convert one to the other is a cast:

for (int i=0; i<16; ++i) arr[i] = (unsigned char) CipherBlock[i];

But you have not specified what kind of data decrypt() expects. From the signature, I suspect integral data (strings are usually char* or const char*) but it's hard to be sure without a context.

Note that you could also do printf("%02X", CipherBlock[i]); for printing.

1
votes

You need to repack the numbers so you can not use memcpy or cast it directly. Aib has it correct.

unsigned char array[16];
for(int i = 0; i < 16; i++) {
    array[i] = CipherBlock[i];
}