⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 helper.c

📁 DVB MPEG2 system stream 分析, 包含 各個talbe(EIT,PMT,PAT,SDT),以及video,audio. 對於學習數字電視有很大幫助.
💻 C
📖 第 1 页 / 共 2 页
字号:
 startbit = 56 - startbit - bitlen; tmp      = tmp >> startbit; mask     = (1ULL << bitlen) - 1;	// 1ULL !!! v        = tmp & mask; return v;}/*  -- get bits out of buffer   (max 64 bit)  -- extended bitrange, so it's slower   -- return: value */unsigned long long getBits64 (u_char *buf, int byte_offset, int startbit, int bitlen){  unsigned long long x1,x2,x3;  if (bitlen <= 32) {     x3 = getBits (buf,byte_offset,startbit,bitlen);   } else {     x1 = getBits (buf,byte_offset,startbit,32);      x2 = getBits (buf,byte_offset,startbit+32,bitlen-32);      x3 = (x1<<(bitlen-32)) + x2;  }  return x3;}/*  ----------------------------------------------------------------------------------- *//*  -- get ISO 639  (3char) language code into string[4]  -- terminate string with \0  -- return ptr to buf; */u_char *getISO639_3 (u_char *str, u_char *buf){  int i;  strncpy (str, buf, 3);  *(str+3) = '\0';  // secure print of string  for (i=0; i<3; i++)   {     if (!isprint(*(str+i))) 	 {	     *(str+i) = '.';     }  }    return str;}/*  -- print_text_468A   -- ETSI EN 300 468  Annex A  -- evaluate string and look on DVB control codes  -- print the string*/static void print_text2_468A (int v, u_char *b, u_int len);void print_text_468A (int v, const char *s,  u_char *b, u_int len){ out (v, s); if (len <= 0) {    out_nl (v,"\"\""); } else {    out (v,"\"");    print_text2_468A (v, b,len);    out (v,"\"");    out_nl (v,"  -- Charset: %s", dvbstrTextCharset_TYPE (*b)); }}static void print_text2_468A (int v, u_char *b, u_int len){  int    in_emphasis = 0;  int    i;  u_char c;  u_char em_ON  = 0x86;  u_char em_OFF = 0x87;   for (i=0; i<len; i++)   {    c = b[i];    if (i == 0 && c < 0x20) continue;   // opt. charset descript.    if (c == em_ON) {       in_emphasis = 1;       out (v,"<EM>");       continue;    }    if (c == em_OFF) {       in_emphasis = 0;       out (v,"</EM>");       continue;    }       if (c == 0x8A)     out (v, "<BR>");       else if (c < 0x20) out (v, ".");       else               out (v, "%c", c);  } // for  }/*  -- print_text_UTF8  -- print the string using UTF8  -- (use std_ascii)*/void print_text_UTF8 (int v, const char *s,  u_char *b, u_int len){   print_std_ascii (v, s, b, len);}/*  -- print standard ascii text*/void print_std_ascii (int v, const char *s, u_char *b, u_int len){  int    i;  u_char c;   out (v,"%s\"",s);  for (i=0; i<len; i++) {    c = b[i];    if (!isprint (c)) c = '.';    out (v, "%c", c);  }   out_nl (v,"\"");}/* -- print time   40 bit --   16 Bit  MJD,  24 Bit UTC*/ void print_time40 (int v, u_long mjd, u_long utc){ out (v, "0x%lx%06lx (=",mjd, utc); if (mjd > 0)  {   long   y,m,d ,k;   // algo: ETSI EN 300 468 - ANNEX C   y =  (long) ((mjd  - 15078.2) / 365.25);   m =  (long) ((mjd - 14956.1 - (long)(y * 365.25) ) / 30.6001);   d =  (long) (mjd - 14956 - (long)(y * 365.25) - (long)(m * 30.6001));   k =  (m == 14 || m == 15) ? 1 : 0;   y = y + k + 1900;   m = m - 1 - k*12;   out (v, "%02d-%02d-%02d",y,m,d); } out (v, " %02lx:%02lx:%02lx [UTC])",	 (utc>>16) &0xFF, (utc>>8) &0xFF, (utc) &0xFF);}/*  -- print data bytes (str + hexdump)  -- print  "Private Data" and Hex-Dump*/void print_databytes (int v, const char *str, u_char *b, u_int len){  if (len > 0) {     out_nl (v,str);	indent (+1);	printhex_buf (v+1,b,len);	indent (-1);  }}void print_private_data (int v, u_char *b, u_int len){  print_databytes (v,"Private Data:",b,len);}void print_databytes_line  (int v, const char *str, u_char *b, u_int len){  if (len > 0) {     out (v,"%s ",str);     printhexline_buf (v+1,b,len);  }}/*   -- str2i   -- string to integer   --   x, 0x ist Hex   --   ansonsten Dezimal   return:  long int*/long  str2i  (char *s){ long v;  if (!s) {	 fprintf (stderr,"str2i: NULL ptr (abort)\n");	 exit(-1); } v = strtol (s, NULL, 0); return v;}/* -- latitude coordinates   (Cell Descriptors) -- longitude coordinates   (Cell Descriptors) -- ETSI EN 300 468*/ static char *_str_cell_latitude_longitude (long ll, int angle);char *str_cell_latitude (long latitude){ // cell_latitude: This 16-bit field, coded as a two's complement number, // shall specify the latitude of the corner of a spherical rectangle that // approximately describes the coverage area of the cell indicated. It shall // be calculated by multiplying the value of the latitude field by // (90 ?/2^15 ). Southern latitudes shall be considered negative and // northern latitudes positive. return _str_cell_latitude_longitude (latitude, 90);}char *str_cell_longitude (long longitude){ // cell_longitude: This 16-bit field, coded as a two's complement number, shall // specify the longitude of the corner of a spherical rectangle that approximately // describes the coverage area of the cell indicated. It shall be calculated by // multiplying the value of the longitude field by (180 ?/2^15 ). Western // longitudes shall be considered negative and eastern longitudes positive. return _str_cell_latitude_longitude (longitude, 180);}static char *_str_cell_latitude_longitude (long ll, int angle){ long long  x; long       g1,g2; static     char s[40];	// $$$ not thread safe! x = (long long) ll * angle * 1000; x = x / (2<<15); g1 = x / 1000; g2 = x % 1000; if (g2 <0) g2 = 0 - g2; sprintf (s,"%ld.%04ld grad",g1,g2); return s;}/* * -- display MAC-Address format *  -- input:  High- and Low Word (each 24bit) */void displ_mac_addr (int v, long mac_H24, long mac_L24){   out (v,"%02x:%02x:%02x",	   (mac_H24>>16) & 0xFF, (mac_H24>>8) & 0xFF, mac_H24 & 0xFF);   out (v,"%02x:%02x:%02x",	   (mac_L24>>16) & 0xFF, (mac_L24>>8) & 0xFF, mac_L24 & 0xFF);}/* * -- display IP-Address format *  -- input: IP-Addr.  */void displ_IPv4_addr (int v, u_long ip){   out (v,"%d.%d.%d.%d",	(ip>>24) & 0xFF, (ip>>16) & 0xFF, (ip>>8) & 0xFF, ip & 0xFF);}/* * -- display IPv6-Address format *  -- input: IPv6-Addr.  */void displ_IPv6_addr (int v, struct IPv6ADDR *a){   out (v,"%x:%x:%x:%x:%x:%x:%x:%x",	(a->ip[0]>>16) & 0xFFFF, (a->ip[0]) & 0xFFFF,	(a->ip[1]>>16) & 0xFFFF, (a->ip[1]) & 0xFFFF,	(a->ip[2]>>16) & 0xFFFF, (a->ip[2]) & 0xFFFF,	(a->ip[3]>>16) & 0xFFFF, (a->ip[3]) & 0xFFFF       );}/* * --  return a bit string for value, len bits * --  NOT thread-safe !!!  $$$ */char *str_bit32 (u_long value, int bits){   static char bitstr[65];   char *s = bitstr;   if (bits > 64) bits = 64;   s += bits;   // reverse bit shift to get real order    *s = '\0';   while (bits-- > 0) {	   *(--s) = (value & 0x01) ? '1' :'0';	   value = value >> 1;   }   return bitstr;}

⌨️ 快捷键说明

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