shiftbit.c

来自「ITU-T G.711语音编解码程序」· C语言 代码 · 共 107 行

C
107
字号
/*   =======================================================================   SHIFTBIT.C   ~~~~~~~~~~   Description   ~~~~~~~~~~~   Shift samples from input file (in Qx format) such that the output file   will be in the Qy format, with sign extension. In fact, what this does   is multiply by the factor 2**(y-x) (if left-shift) or divide by the   factor 2**(x-y) (if right-shift) the input samples.   Includes:   ~~~~~~~~~      specific: ugstdemo.h      system:   stdio.h,stat.h   Author:   ~~~~~~~   Simao Ferraz de Campos Neto   DDS/Pr11                      Tel: +55-192-39-1396                   CPqD/Telebras                 Fax: +55-192-53-4754                   13085 Campinas SP Brazil      E-mail: <tdsimao@venus.cpqd.ansp.br>                                          History:   ~~~~~~~~   08.Feb.91 v1.0 Created!   =======================================================================*/#include "ugstdemo.h"#include <stdio.h>/*  * Includes dependent of the Operating System  */#if defined(VMS)# include <stat.h>#elif defined (MSDOS)# include <sys\stat.h>#else# include <sys/stat.h>#endif#define RIGHT 1#define LEFT -1main(argc,argv)int argc;char *argv[];{  char inp[50],out[50];  short *buf;  int qinp,qout,shift,dir;  FILE *Fi, *Fo;  int fi,fo;#ifdef VMS  char mrs[15]="mrs=512";#endif  struct stat info;  long l,k;  GET_PAR_S(1, "Input file: ......... ", inp);  GET_PAR_I(2, "Input file is Q.",qinp);  GET_PAR_S(3, "Output file: ........ ", out);  GET_PAR_I(4, "Input file is Q.",qout);    if (qout == qinp)     HARAKIRI("Makes no sense a shift of 0 ... \n",7)  else if (qout > qinp) dir=RIGHT;  else dir=LEFT;   l= qout-qinp;   if (l<0) l= -l;  for (shift = 1, k=0; k < l; k++) shift *=2;  if ((Fi = fopen(inp,RB)) == NULL) KILL (inp,2); fi=fileno(Fi);  if ((Fo = fopen(out,WB)) == NULL) KILL (inp,3); fo=fileno(Fo);  stat(inp,&info);  if ((buf=(short *)malloc(info.st_size))==NULL)     HARAKIRI ("Can't alloc inp\n",4);  l=info.st_size/2;  fprintf(stderr, "%s: Reading, ",inp);  for (k=0; k<l; k+=256)    if (read(fi,&buf[k],512)<0) KILL (inp,5);  fprintf(stderr, "shifting, ");  if (dir==RIGHT)     for (k=0; k<l; k++) buf[k] = (buf[k]*shift);  else     for (k=0; k<l; k++) buf[k] = (buf[k]/shift);  fprintf(stderr, "and writing ... ");  for (k=0; k<l; k+=256)    if (write(fo,&buf[k],512)<=0) KILL (inp,6);  fprintf(stderr, "Done!\n");  fclose(Fi); fclose(Fo);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?