Meandry PHP

Wszystkie narzędzia, wtyczki, programy itp. pomocne przy znajdowaniu skrzynek i dbaniu o lasy...

Moderator: Moderatorzy

Awatar użytkownika
filips
Forumator
Posty: 2199
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 13 razy
Otrzymał podziękowań: 81 razy
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:chr($a) gdzie $a >128 nie działa? Czy zapis outputu do pliku nie działa?
Awatar użytkownika
sp2ong
Forumator
Posty: 2199
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 3 razy
Otrzymał podziękowań: 15 razy

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:
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:
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
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
angelo
Wyjadacz
Posty: 471
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 0
Otrzymał podziękowań: 4 razy

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:
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:
$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 przez angelo dnia Pią, 28 Wrz 2007 13:01, w całości zmieniany 1 raz




Powrót do góry



[img]templates/subTrail/images/lang_polish/icon_beer.gif"%20width="59"%20height="18"%20alt="Postaw%20piwo%20autorowi%20tego%20posta"%20title="Postaw%20piwo%20autorowi%20tego%20posta[/img]
[img]templates/subTrail/images/lang_polish/icon_profile.gif"%20alt="Zobacz%20profil%20autora"%20title="Zobacz%20profil%20autora[/img] [img]templates/subTrail/images/lang_polish/icon_pm.gif"%20alt="Wyślij%20prywatną%20wiadomość"%20title="Wyślij%20prywatną%20wiadomość[/img]
Awatar użytkownika
sp2ong
Forumator
Posty: 2199
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 3 razy
Otrzymał podziękowań: 15 razy

Post autor: sp2ong »

Zgadza sie jest OK
Waldek
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
angelo
Wyjadacz
Posty: 471
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 0
Otrzymał podziękowań: 4 razy

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
Forumator
Posty: 2199
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 3 razy
Otrzymał podziękowań: 15 razy

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
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
angelo
Wyjadacz
Posty: 471
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 0
Otrzymał podziękowań: 4 razy

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
Forumator
Posty: 2199
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 3 razy
Otrzymał podziękowań: 15 razy

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
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
angelo
Wyjadacz
Posty: 471
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 0
Otrzymał podziękowań: 4 razy

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:
Warning: pack(): 1 arguments unused in ... on line ...


a jeżeli chodzi o błąd. hmm... dunno. poniższe:

Kod:
$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:96 BC 08 00 F8 20 07 00

wygląda jakby bład był gdzie indziej.
angelo
Wyjadacz
Posty: 471
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 0
Otrzymał podziękowań: 4 razy

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:
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