user-0 提问: 传递H264的时候，RTSP抓包获得的pps sps，怎么解析啊？

回复:
user: user-1
content: 你先把二进制数据拿到手，再对着264标准分析pps sps

user: user-2
content: void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }   电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:base64编码？  嗯。是滴，解码部分怎么弄呢？把字符串传进去，然后用string打印吗？

user: user-2
content: base64编码？ #pragma comment(lib,"crypt32") #include <windows.h> #include <stdio.h> #include <tchar.h>  //+------------------------------------------------------------------------- // convert formatted string to binary // If cchString is 0, then pszString is NULL terminated and // cchString is obtained via strlen() + 1. // dwFlags defines string format // if pbBinary is NULL, *pcbBinary returns the size of required memory // *pdwSkip returns the character count of skipped strings, optional // *pdwFlags returns the actual format used in the conversion, optional //-------------------------------------------------------------------------- BOOL WINAPI CryptStringToBinaryA(     IN     LPCSTR  pszString,     IN     DWORD     cchString,     IN     DWORD     dwFlags,     IN     BYTE     *pbBinary,     IN OUT DWORD    *pcbBinary,     OUT    DWORD    *pdwSkip,    //OPTIONAL     OUT    DWORD    *pdwFlags    //OPTIONAL     ); //+------------------------------------------------------------------------- // convert formatted string to binary // If cchString is 0, then pszString is NULL terminated and // cchString is obtained via strlen() + 1. // dwFlags defines string format // if pbBinary is NULL, *pcbBinary returns the size of required memory // *pdwSkip returns the character count of skipped strings, optional // *pdwFlags returns the actual format used in the conversion, optional //-------------------------------------------------------------------------- BOOL WINAPI CryptStringToBinaryW(     IN     LPCWSTR  pszString,     IN     DWORD     cchString,     IN     DWORD     dwFlags,     IN     BYTE     *pbBinary,     IN OUT DWORD    *pcbBinary,     OUT    DWORD    *pdwSkip,    //OPTIONAL     OUT    DWORD    *pdwFlags    //OPTIONAL     ); #ifdef UNICODE #define CryptStringToBinary  CryptStringToBinaryW #else #define CryptStringToBinary  CryptStringToBinaryA #endif // !UNICODE  //+------------------------------------------------------------------------- // convert binary to formatted string // dwFlags defines string format // if pszString is NULL, *pcchString returns the size of required memory in byte //-------------------------------------------------------------------------- BOOL WINAPI CryptBinaryToStringA(     IN     CONST BYTE  *pbBinary,     IN     DWORD        cbBinary,     IN     DWORD        dwFlags,     IN     LPSTR      pszString,     IN OUT DWORD       *pcchString     ); //+------------------------------------------------------------------------- // convert binary to formatted string // dwFlags defines string format // if pszString is NULL, *pcchString returns the size of required memory in byte //-------------------------------------------------------------------------- BOOL WINAPI CryptBinaryToStringW(     IN     CONST BYTE  *pbBinary,     IN     DWORD        cbBinary,     IN     DWORD        dwFlags,     IN     LPWSTR      pszString,     IN OUT DWORD       *pcchString     ); #ifdef UNICODE #define CryptBinaryToString  CryptBinaryToStringW #else #define CryptBinaryToString  CryptBinaryToStringA #endif // !UNICODE  // dwFlags has the following defines #define CRYPT_STRING_BASE64HEADER           0x00000000 #define CRYPT_STRING_BASE64                 0x00000001 #define CRYPT_STRING_BINARY                 0x00000002 #define CRYPT_STRING_BASE64REQUESTHEADER    0x00000003 #define CRYPT_STRING_HEX                    0x00000004 #define CRYPT_STRING_HEXASCII               0x00000005 #define CRYPT_STRING_BASE64_ANY             0x00000006 #define CRYPT_STRING_ANY                    0x00000007 #define CRYPT_STRING_HEX_ANY                0x00000008 #define CRYPT_STRING_BASE64X509CRLHEADER    0x00000009 #define CRYPT_STRING_HEXADDR                0x0000000a #define CRYPT_STRING_HEXASCIIADDR           0x0000000b  #define CRYPT_STRING_NOCR                   0x80000000  // CryptBinaryToString uses the following flags // CRYPT_STRING_BASE64HEADER - base64 format with certificate begin //                             and end headers // CRYPT_STRING_BASE64 - only base64 without headers // CRYPT_STRING_BINARY - pure binary copy // CRYPT_STRING_BASE64REQUESTHEADER - base64 format with request begin //                                    and end headers // CRYPT_STRING_BASE64X509CRLHEADER - base64 format with x509 crl begin //                                    and end headers // CRYPT_STRING_HEX - only hex format // CRYPT_STRING_HEXASCII - hex format with ascii char display // CRYPT_STRING_HEXADDR - hex format with address display // CRYPT_STRING_HEXASCIIADDR - hex format with ascii char and address display // // CryptBinaryToString accepts CRYPT_STRING_NOCR or'd into one of the above. // When set, line breaks contain only LF, instead of CR-LF pairs.  // CryptStringToBinary uses the following flags // CRYPT_STRING_BASE64_ANY tries the following, in order: //    CRYPT_STRING_BASE64HEADER //    CRYPT_STRING_BASE64 // CRYPT_STRING_ANY tries the following, in order: //    CRYPT_STRING_BASE64_ANY //    CRYPT_STRING_BINARY -- should always succeed // CRYPT_STRING_HEX_ANY tries the following, in order: //    CRYPT_STRING_HEXADDR //    CRYPT_STRING_HEXASCIIADDR //    CRYPT_STRING_HEXASCII //    CRYPT_STRING_HEX   char *flags[12]={ "CRYPT_STRING_BASE64HEADER", "CRYPT_STRING_BASE64", "CRYPT_STRING_BINARY", "CRYPT_STRING_BASE64REQUESTHEADER", "CRYPT_STRING_HEX", "CRYPT_STRING_HEXASCII", "CRYPT_STRING_BASE64_ANY", "CRYPT_STRING_ANY", "CRYPT_STRING_HEX_ANY", "CRYPT_STRING_BASE64X509CRLHEADER", "CRYPT_STRING_HEXADDR", "CRYPT_STRING_HEXASCIIADDR", }; #define MAXC 1024 BYTE b[22]={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, 0x41,0x42,0xB0,0xA1,0x4A,0x55, }; BOOL r; DWORD len,dwFlags; TCHAR s[MAXC]; int _tmain() {     _tprintf(_T("API CryptBinaryToString in crypt32.dll Demonstration:\n"));     for (dwFlags=0;dwFlags<12;dwFlags++) {         if (dwFlags==2          || dwFlags==6          || dwFlags==7          || dwFlags==8) continue;         r=CryptBinaryToString(b,22,dwFlags,NULL,&len);         if (!r) {             _tprintf(_T("CryptBinaryToString error!\n"));             return 1;         }         if (len>MAXC) {             _tprintf(_T("%d==len>MAXC==%d!\n"),len,MAXC);             return 2;         }         r=CryptBinaryToString(b,22,dwFlags,s,&len);         if (!r) {             _tprintf(_T("CryptBinaryToString error!\n"));             return 3;         }         _tprintf(_T("\n%s:[\n%s]\n"),flags[dwFlags],s);     }     return 0; } //API CryptBinaryToString in crypt32.dll Demonstration: // //CRYPT_STRING_BASE64HEADER:[ //-----BEGIN CERTIFICATE----- //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ== //-----END CERTIFICATE----- //] // //CRYPT_STRING_BASE64:[ //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ== //] // //CRYPT_STRING_BASE64REQUESTHEADER:[ //-----BEGIN NEW CERTIFICATE REQUEST----- //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ== //-----END NEW CERTIFICATE REQUEST----- //] // //CRYPT_STRING_HEX:[ //        00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f //        41 42 b0 a1 4a 55 //] // //CRYPT_STRING_HEXASCII:[ //        00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f   ................ //        41 42 b0 a1 4a 55                                  AB..JU //] // //CRYPT_STRING_BASE64X509CRLHEADER:[ //-----BEGIN X509 CRL----- //AAECAwQFBgcICQoLDA0OD0FCsKFKVQ== //-----END X509 CRL----- //] // //CRYPT_STRING_HEXADDR:[ //0000    00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f //0010    41 42 b0 a1 4a 55 //] // //CRYPT_STRING_HEXASCIIADDR:[ //0000    00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f   ................ //0010    41 42 b0 a1 4a 55                                  AB..JU //] //