PHP: struct mpeghdr_t { unsigned char syncbyte:8; unsigned char transperror:1; unsigned char payloadUS:1; unsigned char transportpriority:1; unsigned short pid:13; unsigned char scramblingcontrol:2; unsigned char adaptationfieldexist:2; unsigned char continuitycounter:4; }; Подскажите, что не так в данной структуре, вроде бы все смещения правильные, однако PHP: mpeghdr_t *pMpeg = (mpeghdr_t *)buff; LogPrintf( "PID: %d\n", pMpeg->pid ); выдает чушь, а PHP: unsigned short pid = (buff[1] << 8 | buff[2]) & 0x1fff; LogPrintf( "PID: %d\n", pid ); выдает правильный результат.
наверное из-за автовыравнения структур. попробуй записать так: Code: #pragma pack(push, 1) typedef struct _mpeghdr_t { unsigned char syncbyte:8; unsigned char transperror:1; unsigned char payloadUS:1; unsigned char transportpriority:1; unsigned short pid:13; unsigned char scramblingcontrol:2; unsigned char adaptationfieldexist:2; unsigned char continuitycounter:4; } mpeghdr_t; #pragma pack(pop)
Так 100% должно работать. У тебя ошибка была еще в том, что биты не правильно сцеплялись в байты. Такая структура - 4 байта. То что я перед этим показал - 5 байта была из-за неправильного сцепления бит в байты а то что ты показал - там было 6 байт из-за округления. Code: #pragma pack(push, 1) typedef struct _mpeghdr_t { unsigned char syncbyte; unsigned short transperror:1; unsigned short payloadUS:1; unsigned short transportpriority:1; unsigned short pid:13; unsigned char scramblingcontrol:2; unsigned char adaptationfieldexist:2; unsigned char continuitycounter:4; } mpeghdr_t; #pragma pack(pop)
Хм, опять же не работает, у меня TS с PID 1000, а структура выводит: 7424 и 7432 PHP: #pragma pack(push, 1) typedef struct _mpeghdr_t { unsigned char syncbyte; unsigned short transperror:1; unsigned short payloadUS:1; unsigned short transportpriority:1; unsigned short pid:13; unsigned char scramblingcontrol:2; unsigned char adaptationfieldexist:2; unsigned char continuitycounter:4; } mpeghdr_t; #pragma pack(pop) void __stdcall StreamGetter( unsigned char *buff, int len ) { if( len != 188 ) { LogPrintf( "Warning: Size TP pack: %d != 188\n", len ); return; } mpeghdr_t *pMpeg = (mpeghdr_t *)buff; LogPrintf( "PID: %d\n", pMpeg->pid ); unsigned short pid = (buff[1] << 8 | buff[2]) & 0x1fff; LogPrintf( "Rel PID: %d\n", pid ); } Может, я ошибся в составлении структуры? Документация по TS
вообще откуда такие вычисления? unsigned short pid = (buff[1] << 8 | buff[2]) & 0x1fff; структура правильная это 100% покажи первые 4 байта буфера.
Ок Code: PID: 7432 Rel PID: 1000 Hex Pack: 47 43 E8 15 PID: 7424 Rel PID: 1000 Hex Pack: 47 03 E8 16 PID: 7432 Rel PID: 1000 Hex Pack: 47 43 E8 17 PID: 7432 Rel PID: 1000 Hex Pack: 47 43 E8 18 PID: 7424 Rel PID: 1000 Hex Pack: 47 03 E8 19 PID: 7424 Rel PID: 1000 Hex Pack: 47 03 E8 1A PID: 3208 Rel PID: 100 Hex Pack: 47 40 64 16 PID: 7432 PID: 520 Rel PID: 16 Hex Pack: 47 40 10 16
Вот же блин, жестоко выходит тут всё с этими битами за счет того что они повёрнуты Code: #pragma pack(push, 1) typedef struct _mpeghdr_t { DWORD syncbyte:8; DWORD pid_h:5; DWORD transperror:1; DWORD payloadUS:1; DWORD transportpriority:1; DWORD pid_l:8; DWORD scramblingcontrol:2; DWORD adaptationfieldexist:2; DWORD continuitycounter:4; } mpeghdr_t; #pragma pack(pop) PID = (pid_h << 8) + pid_l;