从无符号转换为C中的signed char

Sri*_*ram 4 c casting char unsigned-char

我正在将输入raw pcm流转换为mp3使用lame.该库中的编码函数返回mp3类型数组中的编码样本unsigned char.这个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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题:
1.下面的代码中的隐式类型转换(通过传入buff函数display安全性证明了吗?是否可能发生一些奇怪的行为?
2.鉴于我没有什么选择,只能坚持使用函数它们存在,是否有一种将unsigned chars 数组转换为s 的"安全"方式char

Die*_*Epp 6

转换unsigned char *char *(反之亦然)的唯一问题是它应该是一个错误.用演员表修复它.

display((char *) buff, len);
Run Code Online (Sandbox Code Playgroud)

注意:此演员表是不必要的:

printf("char = %c", (char) i);
Run Code Online (Sandbox Code Playgroud)

这可以:

printf("char = %c", i);
Run Code Online (Sandbox Code Playgroud)

%c格式需要一个intARG,首先,因为它是不可能通过一charprintf()反正(它会永远地转化为int,或在极其偶然的情况下,unsigned int).