[ Paxy @ 15.02.2010. 13:18 ] @
Pozdrav,

Pokusavam da napravim PHP modul koji ce generisati jedan binearni fajl.
Struktura fajla je originalno sastavljenja preko Delphi aplikacije.

Da bih upisao neko string polje u binearni fajl upisujem prvo:
- bajt 0x6 (print "\x6")
- broj karaktera (u jednom bajtu)
- svaki karakter tog stringa

Primer string PRoba: 06 05 50 52 6F 62 61

Problem nastaje u tome kako da upsem u taj jedan bajt velicinu stringa.
strlen vraca int koji putem print-a PHP pretvara u jedan string za svaku cifru, pa i jedan bajt za svaku cifru.
Navodno funkcije pack bi trebala da odradi posao, ali kada pozovem pack("C1",10) (upakuj u jedan bajt broj 10), dobijem Binearno kodiran dekandi broj ili 0D 0A, ali opet dva bajta.

Da li neko ima ideju, kako mogu integer da upisem u jedan bajt ?
[ Paxy @ 15.02.2010. 13:26 ] @
U Javi sam to odradio preko cast-a:
f.write((byte) (short) string.length());

Ima li neko ideju kako to uraditi u PHP ?

Edit:

Problem resen.
$num=strlen($msg);
echo chr($num);


[Ovu poruku je menjao Paxy dana 15.02.2010. u 15:04 GMT+1]
[ Goran Rakić @ 15.02.2010. 14:05 ] @
Code:

$x = pack('C', (int) 15);

$f = fopen('as.txt', 'wb');
fwrite($f, $x);
fclose($f);



Code:

$ hexdump as.txt 
0000000 000f                                   
0000001


Tvoje "rešenje" radi samo do 255 jer ne postoji ASCII znak na poziciji 306. Za dužinu preko 255 chr() vraća praznu nisku.

0x0D 0x0A je po ASCII tabeli niska "\r\n", verovatno to dobijaš kao sporedni efekat funkcije koju koristiš za ispis. To nije tvoje 10 (koje je igrom slučaja takođe 0x0A). Decimalno kodirano 10 u ASCII tabeli bi bilo 0x31 0x30.


[Ovu poruku je menjao Goran Rakić dana 15.02.2010. u 15:17 GMT+1]
[ Paxy @ 15.02.2010. 14:32 ] @
Hvala na odgovoru.

Sigurno je mnogo elegantnije i sigurnije resenje preko pack, samo sto meni to malo pre nije proslo.
Sa cast-om u int nakon strlen radi kako treba.
Hvala opet.
[ Goran Rakić @ 15.02.2010. 14:53 ] @
chr() nikako nije cast u int.
[ Nikola Poša @ 15.02.2010. 16:07 ] @
PHP takođe podržava cast-ovanje, npr.:
Code:
$foo = (int)$foo;
$bar = (bool)$bar;

Možda sam ja pogrešno shvatio šta ti hoćeš da postigneš, ali ta chr() funkcija radi totalno drugu stvar... Čak bi mi bilo logičnije da si koristio ord() umesto chr().
[ Goran Rakić @ 15.02.2010. 16:32 ] @
On hoće da upiše taj int u binarnu datoteku.

Dakle, ne želi da upiše testualnu nisku "15" (po ASCII tabeli bajtovi 0x31 0x35), već baš vrednost 15 = 0x0F. Našao je trik da pomoću chr() nađe koji je to petnaesti znak u ASCII tabeli i ispiše njega. Problem je što ne postoji 300. znak u ASCII tabeli, pa ovo radi samo za 0-255, o čitljivosti da ne govorim.

Funkcija pack() omogućava konstrukciju binarne niske sa proizvoljnim sadržajem, koju onda može da ispiše.
[ Paxy @ 15.02.2010. 17:16 ] @
Sa pack se radi generalno prebacivanje podataka u binerani format.

@Gorane
U svakom slucaju i chr() bi posluzio posto brojevi preko 255 ne mogu da stanu u jedan bajt :)

Tnx