首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

开一新贴:d如何写C中对应的位段语句?(好象有点难度的)

2012-02-15 
开一新贴:d怎么写C中对应的位段语句?(好象有点难度的)/************************************************

开一新贴:d怎么写C中对应的位段语句?(好象有点难度的)
/*****************************************************************************/
/*   tpkMpegInfo.h   */
/*   */
/*   Includes   FileInfo   structures   definition   and   functions   declaration   */
/*   */
/*****************************************************************************/

#ifndef   _TPK_MPEGINFO_H_
#define   _TPK_MPEGINFO_H_


#if   defined(__cplusplus)
extern   "C "
{                  
#endif

#include   <windows.h>

#ifndef   TPKRTDAPI
#define   TPKRTDAPI   __stdcall
#endif

#ifdef   _WIN32  
#define       far
#endif  

/***********************Error   List********************************/
#define   NO_SUCH_FILE0x1
#define   MEMORY_ALLOC_ERR0x2
#define   FILE_NOT_SUPPORT0x3
/*********************End   Error   List******************************/

typedef   enum   {
VP_VF_MPEG_I=1,
VP_VF_MPEG_II
}VIDEO_TYPE;

typedef   enum   {
VP_ST_VIDEO=0,//mpeg   video  
VP_ST_AUDIO,//mpeg   audio   or   uncompressed   wav
VP_ST_PES,//mpeg   pes
VP_ST_SYSTEM,//mpeg1
VP_ST_PROGRAM,//mpeg2   program   stream
VP_ST_TRANSPORT_188,//mpeg2   transport   stream,包长188
VP_ST_TRANSPORT_204   //mpeg2   transport   stream,包长204
}SYSTEM_TYPE;

/*   structures   definition   */

/*--   AUDIO_INFO   struct   ----*/
typedef   struct  
{
unsigned   charucStereo:4;                     /*   0=   mono         1=   stereo                                         */
unsigned   charucLayer:4;                       /*   0=   AC-3         1=   Layer-I     2=   Layer-II
3=   Layer-III   4   =   wav15:NOT   SUPPORTRF*/
unsigned   charucBitRateIndex:4   ;
unsigned   charucFreqIndex:4;               /*   0   -   44100,   1   -   48000,   2   -   32000   Hz             */
unsigned   shortunBitRate;                   /*   Bit   Rate   (in   K   bits   per   second).                     */
unsigned   charucMode;
unsigned   charucModeExt;
unsigned   shortunSampFreq;
charszAudioMode[16];    
}   AUDIO_INFO   ,   far   *LP_AUDIO_INFO;

/*--   TIME_CODE   struct   :   from   GOP   */
typedef   struct
{
unsigned   char     isDrop:1;   /*   drop   frame   flag   */
unsigned   char     ucPic:7;
unsigned   char     ucSec;
unsigned   char     ucMin;
unsigned   char     ucHours;
}   TIME_CODE,   far   *LP_TIME_CODE   ;    



/*   Sequence   header   info   */  
typedef   struct
{
intdwOffSet;         /*   OffSet   of   Video   Packet   (Sequence   Header   for   ES)   from   begining   of   file     */
unsigned   short     unHorizSize;
unsigned   short     unVertSize;
unsigned   char       ucPelAspectRatio;
unsigned   char       ucChromaFormat;
unsigned   charucVideoFormat;
unsigned   charucFrameRate;
floatfPicturePerSecond;
unsigned   intdwBitRate;
}SEQ_INFO,     far*   LP_SEQ_INFO;

/*--MAIN_VIDEO_INFO--*/
typedef   struct   tagMAIN_VIDEO_INFO
{
unsigned   shortunVPID;
unsigned   charucStreamID;
unsigned   charfGetInfo:3;  
unsigned   charfSecondField:1;
unsigned   charfGetPTS:3;  
unsigned   char       fTimecode:1;//时码是否正常
VIDEO_TYPEVideoType;
SEQ_INFOSeqInfo;
__int64qwFirstVPTS;
__int64qwLastVPTS;
TIME_CODEFirstTimeCode;
TIME_CODELastTimeCode;
unsigned   charucReserved[8];
struct   tagMAIN_VIDEO_INFO   *pNext;
}MAIN_VIDEO_INFO,   far   *LP_MAIN_VIDEO_INFO;

/*--MAIN_AUDIO_INFO--*/
typedef   struct   tagMAIN_AUDIO_INFO
{
unsigned   shortunAPID;
unsigned   charucStreamID;
unsigned   charfGetInfo:4;  
unsigned   charfGetPTS:4;  
AUDIO_INFOAudioInfo;
__int64qwFirstAPTS;
__int64qwLastAPTS;
unsigned   charucReserved[8];
charszLanguage[20];
struct   tagMAIN_AUDIO_INFO   *   pNext;
}MAIN_AUDIO_INFO,   far   *LP_MAIN_AUDIO_INFO;

/*--SCR_INFO--*/
typedef   struct
{
__int64                 qwFirstSCRB;
__int64                 qwLastSCRB;
}SCR_INFO,   far   *LP_SCR_INFO;

/*--   SUBTITLE(DVD字幕)   INFO   struct   --*/
typedef   struct   tagMAIN_SUBT_INFO
{
unsigned   shortunSubID;
charszLanguage[20];
struct   tagMAIN_SUBT_INFO   *pNext;
}MAIN_SUBT_INFO,   far   *LP_MAIN_SUBT_INFO;

/*--   PROGRAM_TABLE   struct   --*/
typedef   struct   tagPROGRAM_TABLE
{
unsigned   shortunProgramNo;
unsigned   shortucNumVideoStream:4;
unsigned   shortucNumAudioStream:6;
unsigned   shortucNumSubTitle:6;
unsigned   intunMAPPID:13;
unsigned   intunPCRPID:13;
unsigned   intucVerNum:6;
LP_SCR_INFOlpSCRInfo;
LP_MAIN_AUDIO_INFO   lpMainAudio;
LP_MAIN_VIDEO_INFO   lpMainVideo;
LP_MAIN_SUBT_INFO     lpSubInfo;
unsigned   char*pSubClut;
struct   tagPROGRAM_TABLE   *pNext;
}PROGRAM_TABLE,far   *LP_PROGRAM_TABLE;


/*--STREAM_INFO--*/
typedef   struct  
{
int   iOffset;
SYSTEM_TYPE   StreamType;
unsigned   short       unVersion;
unsigned   short   unNumberofProgram;
PROGRAM_TABLE         *lpProgramTable;
unsigned   int           dwMuxRate;
}STREAM_INFO,far   *LP_STREAM_INFO;

/*   FileInfo   function   */
short   TPKRTDAPI   tpkFileInfo(LPCCH   strFileName,LP_STREAM_INFO   *lpInfo);


LP_STREAM_INFO   TPKRTDAPI   tpkFileInfoA(LPCCH   strFileName);

short   TPKRTDAPI   tpkFreeInfo(LP_STREAM_INFO   lpInfo);

unsigned   int   TPKRTDAPI   tpkGetDuration(LPCCH   strFileName);
float   TPKRTDAPI   tpkGetFrameRate(LPCCH   strFileName);

#if   defined(__cplusplus)
}
#endif  
#endif


*******上面是完整的H文件,里面有位段操作,如:
/*--   TIME_CODE   struct   :   from   GOP   */
typedef   struct
{
unsigned   char     isDrop:1;   /*   drop   frame   flag   */
unsigned   char     ucPic:7;
unsigned   char     ucSec;
unsigned   char     ucMin;
unsigned   char     ucHours;
}   TIME_CODE,   far   *LP_TIME_CODE   ;    

中的unsigned   char     isDrop:1;   /*   drop   frame   flag   */
unsigned   char     ucPic:7;
做过的朋友希望能帮忙翻译下,十分感谢,能全部翻译更好,可加分,因为我翻译的其他语句自己不知道是否正确!!!   真有点想现金求教了啊!!!


[解决办法]
Delphi没有C当中的位变量,所以必须至少以字节为单位读写.一个字节可以有8个位,有2种操作方法:1,直接使用逻辑和移位操作;2,使用集合sets.举一个使用集合的例子:
type
TMyBit=0..7;
TMyBits=set of TMyBit;
...
var
Mybits:TMyBits;
f:File;
i:Integer;
...
MyBits:=[]; //b00000000
i:=0;
MyBits:=MyBits+[i]; //b00000001
MyBits:=MyBits+[1]; //b00000011
MyBits:=MyBits+[7]; //b10000011
MyBits:=MyBits-[7]; //b00000011
MyBits:=[0..7]; //b11111111
AssignFile(f, 'c:\test.data ');
Rewrite(f,1);
BlockWrite(f,MyBits,1);
CloseFile(f);
[解决办法]
typedef short (*tpkCALLBACK)(short, LPVOID, LPDWORD);

short func(short, LPVOID, LPDWORD)
{
....具体实现
}
tpkCALLBACK xxx = func;
tpkCALLBACK( ... );这个时候就等价与func( ... );
[解决办法]
现在没事,再给你用图示解释一下:

x x x x x x x x

0 1 2 3 4 5 6 7

计算机基本计量单位是字节,上面是一个字节的二进制形式, 下面0-7表示的是位号,共8个位,每个位x只能表示0或1。
原结构中unsigned char isDrop:1;表示占据一个位,因这个变量在最前面,所以占据了0位;unsigned char ucPic:7;占7个位只能占据1 - 7位的位置了,和起来就是delphi记录的isDrop_ucPic,见下图。

isDrop_ucPic: x xxxxxxx
isDrop ucPic

如果给isDrop=1相当于isDrop_ucPic=1,但是如果ucPic=1,相对IsDrop_ucPic来说,其实是2,加起来为3,所以Delphi中写为isDrop_ucPic := 1 shl 1,前面unPic = 48也是一个道理,相当于isDrop_ucPic = 96,写成Delphi的isDrop_ucPic := 48 shl 1,图示如下:

isDrop_ucPic=99: 1 0000110
isDrop=1 ucPic=48


热点排行