Processing Binary Files In PHP
This little tip might be usefull for people who have recently started learning PHP and have some experience in other languages (like me).
Recently I needed to write a PHP script that would process a binary file I had created in my Delphi program. However, it turned out that fread() doesn’t work as expected – it always returns a string. So if you want to read a 32-bit integer from a binary file, doing $an_integer=fread($f, 4) won’t get the desired result – $an_integer will be a string containing some weird characters.
To correctly read/write binary data in PHP you need to use the pack() and unpack() functions.
For example, to read two cardinals (unsigned 32-bit integer) from a file:
$bin=fread($fp,8);
$data=unpack(”V1x/V1y”,$bin);
fclose($fp)
$data["x"] and $data["y"] would contain the two numbers. The first argument to unpack() defines the structure of data to be read. See the documentation for a description of the format string.
Another thing to note is that Delphi (at least the latest versions) will save fixed-length strings as null-padded (format code “a”). Also, if you write record structures to a file you intend to process with PHP or another non-Delphi program, it is advisable to use the packed keyword to make the actual structure of binary data more predictable.
Related posts :
can u help me about getting data form binary file
that extension is .cgh
Sorry, I don’t know what type of data .cgh files contain and I couldn’t find this extension at http://filext.com/file-extension/chg … I’m afraid I can’t help you in this case.
That is great! Thank you very much for posting this as it is exactly what I was looking for. Nowhere else, including _PHP in a Nutshell_, does anyone mention this critical fact when working with binary data.
You’re welcome
Another very useful tool is bin2hex() if you’re looking to get hex data from the binary file.
Coming from the Java land, I have been searching for a method similar to DataOutputStream.writeUTF() for the last couple of days.
Your tip on the PHP pack() method solved my problem.
Thanks!