📄 helper.c
字号:
/*$Id: helper.c,v 1.37 2005/07/11 23:06:47 rasc Exp $ DVBSNOOP a dvb sniffer and mpeg2 stream analyzer tool http://dvbsnoop.sourceforge.net/ (c) 2001-2004 Rainer.Scherg@gmx.de (rasc)$Log: helper.c,v $Revision 1.37 2005/07/11 23:06:47 rascMultibyte section filter redesign: -f 0x4F.22.33.44.55.66 -m 0x.FF.FF.FF etc.Manpage updateRevision 1.36 2004/11/04 19:21:11 rascFixes and changes on "premiere.de" private sectionsCleaning up "premiere.de" private descriptors (should be final now)Revision 1.35 2004/11/03 21:00:59 rasc - New: "premiere.de" private tables and descriptors (tnx to Peter.Pavlov, Premiere) - New: cmd option "-privateprovider <provider name>" - New: Private provider sections and descriptors decoding - Changed: complete restructuring of private descriptors and sectionsRevision 1.34 2004/10/12 20:37:48 rasc - Changed: TS pid filtering from file, behavior changed - New: new cmdline option -maxdmx <n> (replaces -f using pidscan) - misc. changesRevision 1.33 2004/08/12 22:57:18 rasc - New: MPEG Content Labeling descriptor (H.222.0 AMD1) - New: PES update ITU-T H.222.0 AMD2H.222.0 AMD3 updates startedRevision 1.32 2004/08/08 17:00:25 rascBugfix: Cell List descriptor (tnx to Karsten Siebert)Revision 1.31 2004/08/06 22:21:38 rascNew: TV-Anytime (TS 102 323) RNT descriptors 0x40 - 0x42Revision 1.30 2004/04/19 22:09:33 rascminor changeRevision 1.29 2004/03/13 23:22:14 obihelper.c: In function `str_bit32':helper.c:784: warning: initialization from incompatible pointer typehelper.c:797: warning: return from incompatible pointer typeRevision 1.28 2004/03/09 20:59:23 rascVPS decoding (someone check the NPP & PTY code output please...)Revision 1.27 2004/02/28 12:13:03 rascminor stuffRevision 1.26 2004/02/20 22:18:40 rascDII complete (hopefully)BIOP::ModuleInfo (damned, who is spreading infos over several standards???)maybe someone give me a hint on the selector_byte info!!!some minor changes...Revision 1.25 2004/02/12 21:21:20 rascMHP AIT descriptorssome smaller changesRevision 1.24 2004/02/09 21:25:00 rascAIT descriptorsminor redesign on output routinesRevision 1.23 2004/01/17 23:06:09 rascminor stuff, some restructs in outputRevision 1.22 2004/01/13 23:23:38 rascnew getBits routine (hopfully more optimized)Revision 1.21 2004/01/13 21:04:21 rascBUGFIX: getbits overflow fixed...Revision 1.20 2004/01/02 22:25:38 rascDSM-CC MODULEs descriptors completeRevision 1.19 2004/01/02 16:40:37 rascDSM-CC INT/UNT descriptors completeminor changes and fixesRevision 1.18 2004/01/01 20:09:26 rascDSM-CC INT/UNT descriptorsPES-sync changed, TS sync changed,descriptor scopeother changesRevision 1.17 2003/12/30 14:05:37 rascjust some annotations, so I do not forget these over Sylvester party...(some alkohol may reformat parts of /devbrain/0 ... )cheers!Revision 1.16 2003/12/29 22:14:53 rascmore dsm-cc INT UNT descriptorsRevision 1.15 2003/12/27 22:02:44 rascdsmcc INT UNT descriptors startedRevision 1.14 2003/12/27 14:35:01 rascdvb-t descriptorsDSM-CC: SSU Linkage/DataBroadcast descriptorsRevision 1.13 2003/11/26 23:54:48 rasc-- bugfixes on Linkage descriptorRevision 1.12 2003/11/26 16:27:46 rasc- mpeg4 descriptors- simplified bit decoding and output functionRevision 1.11 2003/10/24 22:17:19 rasccode reorg...Revision 1.10 2003/10/16 19:02:29 rascsome updates to dvbsnoop...- small bugfixes- tables updates from ETR 162Revision 1.9 2003/06/24 23:51:03 rascbugfixes and enhancementsRevision 1.8 2003/02/26 16:45:16 obi- make dvbsnoop work on little endian machines again- fixed mask in getBits for bitlen >= 32Revision 1.7 2003/02/09 23:11:07 rascno messageRevision 1.6 2003/02/09 23:02:47 rasc-- endian check (bug fix)Revision 1.5 2003/02/09 23:01:10 rasc-- endian check (bug fix)Revision 1.4 2003/02/09 22:59:33 rasc-- endian check (bug fix)Revision 1.3 2002/08/17 20:36:12 obino more compiler warningsRevision 1.2 2001/10/06 18:19:18 ToerliSteuerzeichen entfernt. rasc wuerdest du mal bitte nen gescheiten unix-konformen Editor verwenden... windows editoren sind ungeeignetRevision 1.1 2001/09/30 13:05:20 rascdvbsnoop v0.7 -- Commit to CVS*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <assert.h>#include "helper.h"#include "hexprint.h"#include "output.h"#include "strings/dvb_str.h"/* -- output bits -- get bits and print decode -- return: (unsigned long) value */// out text and values without CR/LFu_long outBit_Sx (int verbosity, const char *text, u_char *buf, int startbit, int bitlen){ u_long value; value = getBits(buf,0,startbit,bitlen); if (bitlen <= 8) { out_SB (verbosity,text,(int)value); } else if (bitlen <= 16) { out_SW (verbosity,text,(int)value); } else if (bitlen <= 24) { out_ST (verbosity,text,(int)value); } else { out_SL (verbosity,text,value); } return value;}// out text and valuesu_long outBit_Sx_NL (int verbosity, const char *text, u_char *buf, int startbit, int bitlen){ u_long value; value = outBit_Sx (verbosity,text,buf,startbit,bitlen); out_NL (verbosity); return value;}// out text, values and string related to value (string table function)u_long outBit_S2x_NL (int verbosity, const char *text, u_char *buf, int startbit, int bitlen, char *(*f)(u_long) ){ u_long value; value = getBits(buf,0,startbit,bitlen); if (bitlen <= 8) { out_S2B_NL (verbosity,text,(int)value, (*f)(value)); } else if (bitlen <= 16) { out_S2W_NL (verbosity,text,(int)value, (*f)(value)); } else if (bitlen <= 24) { out_S2T_NL (verbosity,text,(int)value, (*f)(value)); } else { out_S2L_NL (verbosity,text, value, (*f)(value)); } return value;}// out text, values and text2u_long outBit_S2Tx_NL (int verbosity, const char *text, u_char *buf, int startbit, int bitlen, const char *text2 ){ u_long value; value = getBits(buf,0,startbit,bitlen); if (bitlen <= 8) { out_S2B_NL (verbosity,text,(int)value, text2); } else if (bitlen <= 16) { out_S2W_NL (verbosity,text,(int)value, text2); } else if (bitlen <= 24) { out_S2T_NL (verbosity,text,(int)value, text2); } else { out_S2L_NL (verbosity,text, value, text2); } return value;}/* -- same for bitlen > 32 -- return unsigned long long */unsigned long long outBit64_Sx (int verbosity, const char *text, u_char *buf, int startbit, int bitlen){ unsigned long long value; if (bitlen <= 48) { value = getBits48 (buf,0,startbit,bitlen); out_SLL (verbosity,text,(int)value); } else { value = getBits64 (buf,0,startbit,bitlen); out_SLL (verbosity,text,value); } return value;}unsigned long long outBit64_Sx_NL (int verbosity, const char *text, u_char *buf, int startbit, int bitlen){ unsigned long long value; value = outBit64_Sx (verbosity,text,buf,startbit,bitlen); out_NL (verbosity); return value;}/* ----------------------------------------------------------------------------------- *//* -- get bits out of buffer (max 32 bit!!!) -- return: value $$$ TODO to be performance optimized!!*///unsigned long XXgetBits (u_char *buf, int byte_offset, int startbit, int bitlen)//{// u_char *b;// unsigned long v;// unsigned long mask;// unsigned long tmp_long;////// b = &buf[byte_offset + (startbit / 8)];// startbit %= 8;//// if (bitlen > 24) {// // -- 24..32 bit// return (unsigned long) getBits48 (b, 0, startbit, bitlen);// }//// // -- safe is 24 bitlen// tmp_long = (unsigned long)(// (*(b )<<24) + (*(b+1)<<16) +// (*(b+2)<< 8) + *(b+3) );//// startbit = 32 - startbit - bitlen;//// tmp_long = tmp_long >> startbit;// mask = (1ULL << bitlen) - 1; // 1ULL !!!// v = tmp_long & mask;//// return v;//}/* -- get bits out of buffer (max 32 bit!!!) -- return: value*/unsigned long getBits (u_char *buf, int byte_offset, int startbit, int bitlen){ u_char *b; unsigned long v; unsigned long mask; unsigned long tmp_long; int bitHigh; b = &buf[byte_offset + (startbit >> 3)]; startbit %= 8; switch ((bitlen-1) >> 3) { case -1: // -- <=0 bits: always 0 return 0L; break; case 0: // -- 1..8 bit tmp_long = (unsigned long)( (*(b )<< 8) + *(b+1) ); bitHigh = 16; break; case 1: // -- 9..16 bit tmp_long = (unsigned long)( (*(b )<<16) + (*(b+1)<< 8) + *(b+2) ); bitHigh = 24; break; case 2: // -- 17..24 bit tmp_long = (unsigned long)( (*(b )<<24) + (*(b+1)<<16) + (*(b+2)<< 8) + *(b+3) ); bitHigh = 32; break; case 3: // -- 25..32 bit // -- to be safe, we need 32+8 bit as shift range return (unsigned long) getBits48 (b, 0, startbit, bitlen); break; default: // -- 33.. bits: fail, deliver constant fail value out_nl (1," Error: getBits() request out of bound!!!! (report!!) \n"); return (unsigned long) 0xFEFEFEFE; break; } startbit = bitHigh - startbit - bitlen; tmp_long = tmp_long >> startbit; mask = (1ULL << bitlen) - 1; // 1ULL !!! v = tmp_long & mask; return v;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -