Meandry PHP

O współczesnych poszukiwaczach skarbów.

Moderator: Spider

Meandry PHP

Postprzez filips » Pt, 28 wrz 2007 10:18

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)
Avatar użytkownika
filips
Bywalec
 
Posty: 242
Dołączył(a): So, 01 wrz 2007 18:37

Postprzez sp2ong » Pt, 28 wrz 2007 11:14

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
Avatar użytkownika
sp2ong
Bywalec
 
Posty: 265
Dołączył(a): N, 18 mar 2007 13:00

Postprzez angelo » Pt, 28 wrz 2007 11:37

sp2ong napisał(a):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 edytowano Pt, 28 wrz 2007 12:01 przez angelo, łącznie edytowano 1 raz
Avatar użytkownika
angelo
Początkujący
 
Posty: 33
Dołączył(a): Wt, 04 wrz 2007 17:57
Lokalizacja: Gdynia/Kraków

Postprzez sp2ong » Pt, 28 wrz 2007 11:55

Zgadza sie jest OK
Waldek
Avatar użytkownika
sp2ong
Bywalec
 
Posty: 265
Dołączył(a): N, 18 mar 2007 13:00

Postprzez angelo » Pt, 28 wrz 2007 11:59

sp2ong napisał(a):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 :]
Avatar użytkownika
angelo
Początkujący
 
Posty: 33
Dołączył(a): Wt, 04 wrz 2007 17:57
Lokalizacja: Gdynia/Kraków

Postprzez sp2ong » Pt, 28 wrz 2007 12:21

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
Avatar użytkownika
sp2ong
Bywalec
 
Posty: 265
Dołączył(a): N, 18 mar 2007 13:00

Postprzez angelo » Pt, 28 wrz 2007 12:38

sp2ong napisał(a):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.
Avatar użytkownika
angelo
Początkujący
 
Posty: 33
Dołączył(a): Wt, 04 wrz 2007 17:57
Lokalizacja: Gdynia/Kraków

Postprzez sp2ong » Pt, 28 wrz 2007 12:44

angelo napisał(a):
sp2ong napisał(a):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
Avatar użytkownika
sp2ong
Bywalec
 
Posty: 265
Dołączył(a): N, 18 mar 2007 13:00

Postprzez angelo » Pt, 28 wrz 2007 12:51

sp2ong napisał(a):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.
Avatar użytkownika
angelo
Początkujący
 
Posty: 33
Dołączył(a): Wt, 04 wrz 2007 17:57
Lokalizacja: Gdynia/Kraków

Postprzez angelo » Pt, 28 wrz 2007 13:01

angelo napisał(a):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?
Avatar użytkownika
angelo
Początkujący
 
Posty: 33
Dołączył(a): Wt, 04 wrz 2007 17:57
Lokalizacja: Gdynia/Kraków


Powrót do Geocaching

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość