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

Reply via email to