Meandry PHP

O współczesnych poszukiwaczach skarbów.
Awatar użytkownika
filips
Bywalec
Posty: 242
Rejestracja: 01 wrz 2007, 18:37
Kontakt:

Meandry PHP

Post 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?
GeoKrety.org - darmowa alternatywa dla travelbugów
Baza skrzynek dla urządzeń przenośnych (też darmowa)
Awatar użytkownika
sp2ong
Bywalec
Posty: 265
Rejestracja: 18 mar 2007, 13:00
Kontakt:

Post 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.
Waldek
Awatar użytkownika
angelo
Początkujący
Posty: 33
Rejestracja: 04 wrz 2007, 17:57
Lokalizacja: Gdynia/Kraków

Post 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".
Ostatnio zmieniony 28 wrz 2007, 12:01 przez angelo, łącznie zmieniany 1 raz.
Awatar użytkownika
sp2ong
Bywalec
Posty: 265
Rejestracja: 18 mar 2007, 13:00
Kontakt:

Post autor: sp2ong »

Zgadza sie jest OK
Waldek
Awatar użytkownika
angelo
Początkujący
Posty: 33
Rejestracja: 04 wrz 2007, 17:57
Lokalizacja: Gdynia/Kraków

Post 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 :]
Awatar użytkownika
sp2ong
Bywalec
Posty: 265
Rejestracja: 18 mar 2007, 13:00
Kontakt:

Post 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
Waldek
Awatar użytkownika
angelo
Początkujący
Posty: 33
Rejestracja: 04 wrz 2007, 17:57
Lokalizacja: Gdynia/Kraków

Post 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.
Awatar użytkownika
sp2ong
Bywalec
Posty: 265
Rejestracja: 18 mar 2007, 13:00
Kontakt:

Post 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);
Waldek
Awatar użytkownika
angelo
Początkujący
Posty: 33
Rejestracja: 04 wrz 2007, 17:57
Lokalizacja: Gdynia/Kraków

Post 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.
Awatar użytkownika
angelo
Początkujący
Posty: 33
Rejestracja: 04 wrz 2007, 17:57
Lokalizacja: Gdynia/Kraków

Post 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?
ODPOWIEDZ