note 92630 added to function.unpack
| From: | erich at gasboys dot net | Date: | Sat, 01 Aug 2009 04:48:30 +0000 |
| Subject: | note 92630 added to function.unpack | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-158981@lists.php.net to get a copy of this message | ||
I found this function relatively poorly documented, so here is a potentially useful example.
Unfortunately the dbase functions are not compiled into my servers php and I needed to read some geo
data in shape files, which include data in dbfs.
function echo_dbf($dbfname) {
$fdbf = fopen($dbfname,'r');
$fields = array();
$buf = fread($fdbf,32);
$header=unpack( "VRecordCount/vFirstRecord/vRecordLength", substr($buf,4,8));
echo 'Header: '.json_encode($header).'<br/>';
$goon = true;
$unpackString='';
while ($goon && !feof($fdbf)) { // read fields:
$buf = fread($fdbf,32);
if (substr($buf,0,1)==chr(13)) {$goon=false;} // end of field list
else {
$field=unpack( "a11fieldname/A1fieldtype/Voffset/Cfieldlen/Cfielddec",
substr($buf,0,18));
echo 'Field: '.json_encode($field).'<br/>';
$unpackString.="A$field[fieldlen]$field[fieldname]/";
array_push($fields, $field);}}
fseek($fdbf, $header['FirstRecord']+1); // move back to the start of the first record
(after the field definitions)
for ($i=1; $i<=$header['RecordCount']; $i++) {
$buf = fread($fdbf,$header['RecordLength']);
$record=unpack($unpackString,$buf);
echo 'record: '.json_encode($record).'<br/>';
echo $i.$buf.'<br/>';} //raw record
fclose($fdbf); }
This function simply dumps an entire file using echo and json_encode, so you can tweak it to your
own needs... (eg random access would just be a matter of changing the seek to : fseek($fdbf,
$header['FirstRecord']+1 +($header['RecordLength']* $desiredrecord0based);
removing the for loop and returning $record
This function doesn't do any type conversion, but it does extract the type if you need to play
with dates, or tidy up the numbers etc.
So quick and dirty but maybe of use to somebody and illustrates the power of unpack.
Erich
----
Server IP: 117.104.162.229
Probable Submitter: 123.211.86.169 (proxied: 123.211.86.169)
----
Manual Page -- http://www.php.net/manual/en/function.unpack.php
Edit -- https://master.php.net/note/edit/92630
Del: integrated -- https://master.php.net/note/delete/92630/integrated
Del: useless -- https://master.php.net/note/delete/92630/useless
Del: bad code -- https://master.php.net/note/delete/92630/bad+code
Del: spam -- https://master.php.net/note/delete/92630/spam
Del: non-english -- https://master.php.net/note/delete/92630/non-english
Del: in docs -- https://master.php.net/note/delete/92630/in+docs
Del: other reasons-- https://master.php.net/note/delete/92630
Reject -- https://master.php.net/note/reject/92630
Search -- https://master.php.net/manage/user-notes.php