Strona 1 z 1

Meandry PHP

: 28 wrz 2007, 10:18
autor: filips
02 12 17 00

teraz to trzeba zapisac na ASCII i niby jest OK ale kiedy trafia sie cyfry powyzej 128 zapis do pliku znakow ascii cos miesza sie.
tzn

Kod: Zaznacz cały

chr($a)
gdzie $a >128 nie działa? Czy zapis outputu do pliku nie działa?

: 28 wrz 2007, 11:14
autor: sp2ong
Troche opisze problem wiecej. Otoz format pliku UAM jest binarny, ma swoj naglowek i poszczegolne rekordy maja swoja dl. miedzy innymi wspolrzedne w ukl 1992 zapisywane sa w 8 bajtach tzn 4 bajty na X i 4 bajty na Y. Wspolrzedne w ukladzie 1992 maja wyglad np

Kod: Zaznacz cały

565295 247969

te cyfry zamienia sie na HEX  wiec mozemy dostac np

03C8A1 wiec po podzileniu ich na dwojki mamy 3 bajty 

03 C8 A1  czwarty bajt uzupelniam 00

uzywam funkcji hexdec aby zamienic ja na dzisietna cyfre i tu pozniej rozne stosowalem techniki:

chr($a) lub sprintf('%c',$a)

Przyklad takiej skrzynki mam tu:

Plik UAM dla skrzynki OP006D

Kod: Zaznacz cały

wspolrzedna 587833 po zamianie ma na hex 08F839 i po odwroceniu bajtow i zapisaniu w pliku 

sprintf('%c%c%c%c%c%c',hexdec(39),hexdec(F8),hexdec(08),0,0);

musi byc:

39 F8 08 00 00 4F  gdzie 4F litera O od nazwy nastepnego pola (nazwa waypoint)

po obejrzeniu pliku mamy 

39 F8 08 00 96 00 4F

pojawil znak o kodzie HEX 96 

uzywam program uam2gpx do sprawdzenia i tam odrazu widac ze cos nie tak jest przesuniete o jeden bajt dane bo zamiast <type>Geocaching</type> pojawia sie <type>cGeocaching</type>

Nie wiem czemu zapis tej liczby hex na dec i nastepnie na ASCI daje taki wynik w pliku.

: 28 wrz 2007, 11:37
autor: angelo
sp2ong pisze:Troche opisze problem wiecej. Otoz format pliku UAM jest binarny, ma swoj naglowek i poszczegolne rekordy maja swoja dl. miedzy innymi wspolrzedne w ukl 1992 zapisywane sa w 8 bajtach tzn 4 bajty na X i 4 bajty na Y. Wspolrzedne w ukladzie 1992 maja wyglad np

Kod: Zaznacz cały

565295 247969

te cyfry zamienia sie na HEX  wiec mozemy dostac np

03C8A1 wiec po podzileniu ich na dwojki mamy 3 bajty 

03 C8 A1  czwarty bajt uzupelniam 00

uzywam funkcji hexdec aby zamienic ja na dzisietna cyfre i tu pozniej rozne stosowalem techniki:

chr($a) lub sprintf('%c',$a)

rozbijanie tego na chr i sprintf troche niepotrzebnie komplikuje sprawę. poniższy kod zapisuje te dwie współrzędne tak jak trzeba binarnie do pliku i wydaje mi się, że o wiele prościej:

Kod: Zaznacz cały

$file = fopen("test.bin", "wb");
$x = 565295;
$y = 247969;
fwrite($file, pack('L', $x), 4);
fwrite($file, pack('L', $y), 4);
fclose($file);
to powinno załatwić sprawę. w razie wątpliwości, z manuala można doczytać jeszcze, że zamiast "L" - który zapisuje 32 bit unsigned long w byte-order maszyny, można użyć "N", albo "V" żeby wymusić odpowiednio big albo little endian. z przykładu wygląda jakby to musiał być little endian, więc bezpieczniejsze może być użycie "V".

: 28 wrz 2007, 11:55
autor: sp2ong
Zgadza sie jest OK

: 28 wrz 2007, 11:59
autor: angelo
sp2ong pisze:Zgadza sie jest OK
Wiem ;>

ps. W razie innych wątpliwości związanych z programowaniem, zapraszam. Niestety raczej nie czytam wszystkich wątków, zwłaszcza dużych, i gdyby nie nowy pewnie by mi to pytanie umknęło :]

: 28 wrz 2007, 12:21
autor: sp2ong
Ok zrobilem tak:

$thisline1 = mb_ereg_replace('{lat}',pack('L',$y,4),$thisline1);
$thisline1 = mb_ereg_replace('{lon}',pack('L',$x,4),$thisline1);

dla wielu skrzynek jest OK ale np dla tej
OP061B

wstawia dodatkwe 0 pomiedzy wspolrzednymi jest

F8 20 07 00 00 96 BC 08 00

zamiast F8 20 07 00 96 BC 08 00

: 28 wrz 2007, 12:38
autor: angelo
sp2ong pisze:wstawia dodatkwe 0 pomiedzy wspolrzednymi jest

F8 20 07 00 00 96 BC 08 00

zamiast F8 20 07 00 96 BC 08 00
cóż. z czubka głowy nic nie wiem, jak mawiają hamerykanie. musiałbym zobaczyć kod, dane wejściowe i tak dalej :]

jaki jest $x, $y, $thisline1 jak wygląda? jedno mogę Ci powiedzieć od razu, że nie ma sensu przekazywać 4 do f-cji pack.

: 28 wrz 2007, 12:44
autor: sp2ong
angelo pisze:
sp2ong pisze:wstawia dodatkwe 0 pomiedzy wspolrzednymi jest

F8 20 07 00 00 96 BC 08 00

zamiast F8 20 07 00 96 BC 08 00
cóż. z czubka głowy nic nie wiem, jak mawiają hamerykanie. musiałbym zobaczyć kod, dane wejściowe i tak dalej :]

jaki jest $x, $y, $thisline1 jak wygląda? jedno mogę Ci powiedzieć od razu, że nie ma sensu przekazywać 4 do f-cji pack.
no 4 uzylem tak jak podales.


$uamlatlon="{lat}{lon}";
....
$thisline=$uamlatlon;

$x= 467192;
$y= 572566;
$thisline1 = mb_ereg_replace('{lat}',pack('L',$y,4),$thisline1);
$thisline1 = mb_ereg_replace('{lon}',pack('L',$x,4),$thisline1);

: 28 wrz 2007, 12:51
autor: angelo
sp2ong pisze:no 4 uzylem tak jak podales.
ee... blefujesz ;] 4 użyłem, jako trzeciego parametru do "fwrite". jako ilości bajtów do zapisania.

pack, owszem, może przyjąć 3 paramatery, ale w innej sytuacji. a tak da:

Kod: Zaznacz cały

Warning: pack(): 1 arguments unused in ... on line ...
a jeżeli chodzi o błąd. hmm... dunno. poniższe:

Kod: Zaznacz cały

$uamlatlon="{lat}{lon}";
$thisline1=$uamlatlon;

$x= 467192;
$y= 572566;
$thisline1 = mb_ereg_replace('{lat}',pack('L',$y),$thisline1);
$thisline1 = mb_ereg_replace('{lon}',pack('L',$x),$thisline1);

$file = fopen("test.bin", "wb");
fwrite($file, $thisline1);
fclose($file);
tworzy mi 8 bajtowy plik jak trzeba, bez żadnych extra bajtów.

Kod: Zaznacz cały

96 BC 08 00 F8 20 07 00
wygląda jakby bład był gdzie indziej.

: 28 wrz 2007, 13:01
autor: angelo
angelo pisze:wygląda jakby bład był gdzie indziej.
takie coś mi przyszło do głowy. jak telnetem ściągam ten plik co podałeś (OP061B) to wygląda jakby był generowany dobrze:

Kod: Zaznacz cały

BB 22 D5 3F 01 F8 20 96 4F 50 30 ....
gdzie od 4F zaczyna się już kod punktu OP061B... czyli może to byłaby kwestia podania jakiegoś header content-type? żeby przeglądarka traktowała to jako plik binarny?