On 3/13/07, Tom Phoenix <[EMAIL PROTECTED]> wrote:
On 3/13/07, Dharshana Eswaran <[EMAIL PROTECTED]> wrote: > I was going thro the topic "Accessing packed data structures" in the Perl > Complete Reference Book. I came across this example: > > struct utmp { > char ut_user[8]; /* User login name */ > char ut_id[4]; /* /etc/inittab id */ > char ut_line[12]; /* device name */ > short ut_pid; /* process ID */ > short ut_type; /* type of entry */ > struct exit_status ut_exit; /* The exit status of a process */ > /* marked as DEAD_PROCESS. */ > time_t ut_time; /* time entry was made */ > }; > > For the above structure: > > The pack template given was "a8a4a12ssssl". > I am, somehow, not able to understand how to generate the pack template from > the structure's data types. The pieces match up this way: char ut_user[8]; /* User login name: a8 */ char ut_id[4]; /* /etc/inittab id: a4 */ char ut_line[12]; /* device name: a12 */ short ut_pid; /* process ID: s */ short ut_type; /* type of entry: s */ struct exit_status ut_exit; /* The exit status of a process */ /* marked as DEAD_PROCESS: s s */ time_t ut_time; /* time entry was made: l */ A char array becomes an a42, with the number being the length of the array. A short becomes s, and a long becomes l. (You do need to know something about how C stores data in memory. Note that exit_status and ut_exit are two variables, even though they are declared on the same line; that's why there are two s's in the comment.) > Here, how does the pack and unpack play its role? What format should the > input be in? What are the possible formats it can accept here? Have you seen the documentation for pack and unpack? There is a large table of format letters. Are you asking for something else? Do you have a C struct that you can't translate to a pack/unpack template? If so, feel free to post it here. Someone will know how to deal with it. Yes, you are right...
I have a structure and it is somethiung like this typedef struct _TAPI_VOICE_NOTIFY_INCOMING_CALL_MSG_S TAPI_CALL_ID_T callId; TAPI_VOICE_INCOMING_CALL_TYPE_E type; TAPI_PHONE_NUMBER_A phoneNumber; TAPI_CALL_LINE_E lineNo; TAPI_PHONEBOOK_NAME_A alpha; } TAPI_VOICE_NOTIFY_INCOMING_CALL_MSG_S; Here the typedefs are: TAPI_CALL_ID_T, TAPI_PHONE_NUMBER_A, TAPI_PHONEBOOK_NAME_A => Unsigned int 8 TAPI_VOICE_INCOMING_CALL_TYPE_E => enum type TAPI_CALL_LINE_E => signed int 8 Now how do i come up with the pack template? I dont know how a enum should be represented in the pack template. :-( /I8(enum)I8i8I8/ => pack template The above mentioned enum just contains two elements. The data which i need to pack and unpack to these elements are in hex format(0x0B 0x1C 0x34 etc). It is a string of hex bytes. I kindly request anyone to guide me in this. Thanks and Regards, Dharshana