Binärfile auslesen

Binärfile auslesen

am 08.04.2008 23:17:18 von Huber Hans

Hallo NGler,

ich hab ein Binärfile bei dem ich gerne ganz simpel und einfach zur
Erkennung des Formats einen Wert auslesen möchte. Leider komme ich auf
die Schnelle nicht drauf, wie ich z.B. den Int32 der sich dort(von Byte
5-8) befindet in einen String wandle.

Ich nutze fopen um die Datei zu öffnen, in etwa so:

$fp = fopen($file, "r");
fseek($fp, 4);
$myint32 = fread($fp, 4);

Hier habe ich aber ein Problem. In $myint32 scheint noch nicht das
richtige zu stehen, ein (int) for fread bewirkt auch nix. Ich hab schon
eiiges rumprobiert komme aber nicht drauf. Wenn ich so nicht weiter
komme, muss ich das halt in ein php Modul packen und es mit C machen, da
weis ich wie es funktioniert.

Grüße Hans

Re: Binärfile auslesen

am 08.04.2008 23:29:05 von Niels Braczek

Huber Hans schrieb:

> Ich nutze fopen um die Datei zu öffnen, in etwa so:
>=20
> $fp =3D fopen($file, "r");
> fseek($fp, 4);
> $myint32 =3D fread($fp, 4);

Hier hast du genau die Zahl als Binärzahl in 4 Character verpackt.
Anders als bei C interpretiert das Casten nach int in PHP die 4 Bytes
als String und nicht als Binärzahl.

$fp =3D fopen( $file, 'r' );
fseek( $fp, 4 );
$bytes =3D fread( $fp, 4 );

$myInt32 =3D 0;
for ( $i=3D0; $i<4; $i++ ) {
$myInt32 =3D $myInt32*256 + ord( $bytes[$i] );
}

dürfte tun, was du brauchst (ungetestet, HiLo vorausgesetzt).

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Binärfile auslesen

am 08.04.2008 23:31:52 von Huber Hans

Niels Braczek schrieb:
> Huber Hans schrieb:
>
>> Ich nutze fopen um die Datei zu öffnen, in etwa so:
>>
>> $fp = fopen($file, "r");
>> fseek($fp, 4);
>> $myint32 = fread($fp, 4);
>
> Hier hast du genau die Zahl als Binärzahl in 4 Character verpackt.
> Anders als bei C interpretiert das Casten nach int in PHP die 4 Bytes
> als String und nicht als Binärzahl.

Daher
>
> $fp = fopen( $file, 'r' );
> fseek( $fp, 4 );
> $bytes = fread( $fp, 4 );
>
> $myInt32 = 0;
> for ( $i=0; $i<4; $i++ ) {
> $myInt32 = $myInt32*256 + ord( $bytes[$i] );
> }

Ohne es jetzt getestet zu haben, klingt plausibel, werde es Morgen mal
auf meine Datenfiles loslassen.

Danke, Hans
>
> dürfte tun, was du brauchst (ungetestet, HiLo vorausgesetzt).
>
> MfG
> Niels
>

Re: Binärfileauslesen

am 09.04.2008 08:48:56 von David Fuhr

Niels Braczek wrote in
news:ftgo0l$q2a$02$1@news.t- online.com:

> Huber Hans schrieb:
>
> $fp = fopen( $file, 'r' );
> fseek( $fp, 4 );
> $bytes = fread( $fp, 4 );
>
> $myInt32 = 0;
> for ( $i=0; $i<4; $i++ ) {
> $myInt32 = $myInt32*256 + ord( $bytes[$i] );
> }

Da es sich bei $bytes um einen String handelt, sollte mit $bytes{$i}
und nicht mit $bytes[$i] zugegriffen werden.

http://de2.php.net/manual/de/language.types.string.php#langu age.types.strin
g.substr

Gruß
David

Re: Binärfile auslesen

am 09.04.2008 09:00:26 von Niels Braczek

David Fuhr schrieb:
> Niels Braczek wrote in=20

> Da es sich bei $bytes um einen String handelt, sollte mit $bytes{$i}=20
> und nicht mit $bytes[$i] zugegriffen werden.

Das ist Schnee von gestern. Die PHP-Entwickler haben in diesem Punkt
zurückgerudert. [] ist jetzt die korrekte Notation.

> http://de2.php.net/manual/de/language.types.string.php#langu age.types.s=
trin
> g.substr

Deshalb liest man das Original:

http://www.php.net/manual/en/language.types.string.php#langu age.types.str=
ing.substr

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Binärfileauslesen

am 09.04.2008 11:46:42 von David Fuhr

Niels Braczek wrote in
news:fthpfr$the$01$1@news.t-online.com:

> David Fuhr schrieb:
>> Niels Braczek wrote in
>
>> Da es sich bei $bytes um einen String handelt, sollte mit $bytes{$i}
>> und nicht mit $bytes[$i] zugegriffen werden.
>
> Das ist Schnee von gestern. Die PHP-Entwickler haben in diesem Punkt
> zurückgerudert. [] ist jetzt die korrekte Notation.
>
> Deshalb liest man das Original:
>
> http://www.php.net/manual/en/language.types.string.php#langu age.types.s
> tring.substr

Oh, ok.. danke ^^

Re: Binärfileauslesen

am 09.04.2008 14:27:12 von Sven Drieling

Huber Hans wrote:

Hallo,

> ich hab ein Binärfile bei dem ich gerne ganz simpel und einfach zur=

> Erkennung des Formats einen Wert auslesen möchte. Leider komme ich =
auf
> die Schnelle nicht drauf, wie ich z.B. den Int32 der sich dort(von By=
te
> 5-8) befindet in einen String wandle.

Das sollte mit unpack() gehen, was auch Big und Little Endian unterstü=
tzt.

Allerding kennt PHP nur vorzeichenbehaftete Integer, so dass
Werte größer als 2 Mrd. und ein bißchen als negative Zahl zurüc=
kgegeben
werden. Die User Contributed Notes gehen aber darauf auch ein.


tschuess
[|8:)

Re: Binärfile auslesen

am 09.04.2008 18:09:47 von Claus Reibenstein

Huber Hans schrieb:

> ich hab ein Binärfile bei dem ich gerne ganz simpel und einfach zur
¯¯¯¯¯¯¯¯¯

> $fp = fopen($file, "r");
¯¯¯

$fp = fopen($file, "rb");

Den Rest haben andere schon beantwortet.

Gruß. Claus