This file is indexed.

/usr/share/doc/libconvert-binary-c-perl/examples/convert.pl is in libconvert-binary-c-perl 0.78-1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/perl -w
################################################################################
#
# Copyright (c) 2002-2015 Marcus Holland-Moritz. All rights reserved.
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
################################################################################

#===============================================================================
#
#   Parse a C struct and use 'pack', 'unpack', 'sizeof' and 'offsetof'.
#
#===============================================================================

use Convert::Binary::C;
use Data::Dumper;
use strict;

#--------------------------------------------------------------
# Create an object, configure it, and parse some embedded code.
#--------------------------------------------------------------

my $c = Convert::Binary::C->new( LongSize => 4, ShortSize => 2 )
                          ->Alignment( 4 )
                          ->ByteOrder( 'BigEndian' )
                          ->parse( <<'ENDC' );

typedef signed   long  i_32;
typedef unsigned long  u_32;
typedef signed   short i_16;
typedef unsigned short u_16;
typedef signed   char  i_8;
typedef unsigned char  u_8;

struct convert {
  i_8  byte;
  i_16 word[2];
  i_32 dword;
  union {
    u_32 dword;
    u_8  bytes[ sizeof( u_32 ) ];
  }    c32;
};

ENDC

#-----------------------------------------------------------
# Print the offsets and sizes of some of the struct members.
#-----------------------------------------------------------

for( qw( byte word dword ) ) {
  print "offsetof( 'convert', '$_' ) = ", $c->offsetof( 'convert', $_ );
  print ", sizeof( 'convert.$_' ) = ", $c->sizeof( "convert.$_" ), "\n";
}

#-------------------------------------------------
# Pack a Perl data structure into a binary string.
# Note that not all members need to be specified.
#-------------------------------------------------

my $binary = $c->pack( 'convert', {
  word => [-30000, 4711],
  c32  => { dword => 0x01020304 }
} );

#-------------------------------------------------------
# Just a demonstration that pack does the right thing...
#-------------------------------------------------------

if( $c->sizeof( 'convert' ) == length $binary ) {
  print "\nYup, the size matches!\n";
}

#-------------------------------------------------------
# Hexdump the binary string.
# Note that all padding regions are initialized to zero.
#-------------------------------------------------------

print "\nBinary: ", hexdump( $binary ), "\n\n";

#---------------------------------------------------------------
# Unpack the binary string and dump the returned data structure.
#---------------------------------------------------------------

my $data = $c->unpack( 'convert', $binary );
print Data::Dumper->Dump( [$data], ['data'] );

#------------------------------------------------------
# You can modify selected elements in the binary string
# using the 3-argument version of 'pack'.
#------------------------------------------------------

# only 'dword' will be modified
$c->pack( 'convert', { dword => -559038737 }, $binary );
print "\nBinary: ", hexdump( $binary ), "\n\n";
print Dumper( $c->unpack( 'convert', $binary ) );

#--------------------------------------------------
# You can also use pack/unpack on compound members.
#--------------------------------------------------

my $array = $c->unpack( 'convert.c32.bytes', 'ABCD' );
print "\n\$array = [ @$array ]\n";

#==========================================================
#                     SUBROUTINES
#==========================================================

sub hexdump
{
  join ' ', map { sprintf "%02X", $_ } unpack "C*", $_[0];
}