📄 helper.c
字号:
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 + -