我正在使用 lame
将输入 raw pcm
流转换为 mp3
。该库中的编码函数返回类型为 unsigned char
的数组中的 mp3
编码样本。这个 mp3 编码流现在需要放置在一个 flv
容器中,该容器使用一个函数将编码样本写入 char
数组。我的问题是我将数组从 lame
(unsigned char
类型)传递到 flv
库中。下面的一段代码(只是象征性的)说明了我的问题:
/* 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;
}
我的问题:
1. 下面代码中的隐式类型转换(如将buff
传递给函数display
所证明的那样)是否安全?是否可能出现一些奇怪的行为?
2. 鉴于我别无选择,只能坚持使用现有的功能,是否有一种“安全”的方法可以将 unsigned char
数组转换为 char
是吗?
最佳答案
将 unsigned char *
转换为 char *
(反之亦然)的唯一问题是它应该是一个错误。用铸件修复它。
display((char *) buff, len);
注意:这个转换是不必要的:
printf("char = %c", (char) i);
这很好:
printf("char = %c", i);
%c
格式化程序以 int
arg 开头,因为不可能将 char
传递给 printf( )
无论如何(它总是会被转换为 int
,或者在极不可能的情况下,unsigned int
。)
关于在 C 中从 unsigned 转换为 signed char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14746889/