开一新贴: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