Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Upis jednog bajta u fajl

[es] :: PHP :: Upis jednog bajta u fajl

[ Pregleda: 1771 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Paxy
Bojović Petar
Računarski fakultet - Asistent -
Administrator mreže
Rusanj, Beograd

Član broj: 7003
Poruke: 355
109.93.52.*

Sajt: a.paxy.in.rs


+8 Profil

icon Upis jednog bajta u fajl15.02.2010. u 13:18 - pre 172 meseci
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 ?
Fight with the best, fall like a rest.
 
Odgovor na temu

Paxy
Bojović Petar
Računarski fakultet - Asistent -
Administrator mreže
Rusanj, Beograd

Član broj: 7003
Poruke: 355
109.93.52.*

Sajt: a.paxy.in.rs


+8 Profil

icon Re: Upis jednog bajta u fajl15.02.2010. u 13:26 - pre 172 meseci
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]
Fight with the best, fall like a rest.
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Upis jednog bajta u fajl15.02.2010. u 14:05 - pre 172 meseci
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]
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Paxy
Bojović Petar
Računarski fakultet - Asistent -
Administrator mreže
Rusanj, Beograd

Član broj: 7003
Poruke: 355
109.93.52.*

Sajt: a.paxy.in.rs


+8 Profil

icon Re: Upis jednog bajta u fajl15.02.2010. u 14:32 - pre 172 meseci
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.
Fight with the best, fall like a rest.
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Upis jednog bajta u fajl15.02.2010. u 14:53 - pre 172 meseci
chr() nikako nije cast u int.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-2.sezampro.yu.



+33 Profil

icon Re: Upis jednog bajta u fajl15.02.2010. u 16:07 - pre 172 meseci
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().
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Upis jednog bajta u fajl15.02.2010. u 16:32 - pre 172 meseci
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.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Paxy
Bojović Petar
Računarski fakultet - Asistent -
Administrator mreže
Rusanj, Beograd

Član broj: 7003
Poruke: 355
109.93.52.*

Sajt: a.paxy.in.rs


+8 Profil

icon Re: Upis jednog bajta u fajl15.02.2010. u 17:16 - pre 172 meseci
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
Fight with the best, fall like a rest.
 
Odgovor na temu

[es] :: PHP :: Upis jednog bajta u fajl

[ Pregleda: 1771 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.