I am converting an input raw pcm
stream into mp3
using lame
. The encoding function within that library returns mp3
encoded samples in an array of type unsigned char
. This mp3-encoded stream now needs to be placed within an flv
container which uses a function that writes encoded samples in char
array. My problem is that I am passing the array from lame
(of type unsigned char
) into the flv
library. The following piece of code (only symbolic) illustrates my problem:
/* cast from unsigned char to char. */
#include <stdio.h>
#include <stdlib.h>
void display(char *buff, int len) {
int i = 0;
for(i = 0; i < len; i++) {
printf("buff[%d] = %c\n", i, buff[i]);
}
}
int main() {
int len = 10;
unsigned char* buff = (unsigned char*) malloc(len * sizeof(unsigned char));
int i = 0;
for(i = 65; i < (len + 65); i++) {
buff[i] = (unsigned char) i;
printf("char = %c", (char) i);
}
printf("Displaying array in main.\n");
for(i = 0; i < len; i++) {
printf("buff[%d] = %u\n", i, 'buff[i]');
}
printf("Displaying array in func.\n");
display(buff, len);
return 0;
}
My question(s):
1. Is the implicit type conversion in the code below (as demonstrated by passing of buff
into function display
safe? Is some weird behaviour likely to occur?
2. Given that I have little option but to stick to the functions as they are present, is there a "safe" way of converting an array of unsigned char
s into char
s?
The only problem with converting unsigned char *
into char *
(or vice versa) is that it's supposed to be an error. Fix it with a cast.
display((char *) buff, len);
Note: This cast is unnecessary:
printf("char = %c", (char) i);
This is fine:
printf("char = %c", i);
The %c
formatter takes an int
arg to begin with, since it is impossible to pass a char
to printf()
anyway (it will always get converted to int
, or in an extremely unlikely case, unsigned int
.)