tzn Kod:chr($a) gdzie $a >128 nie działa? Czy zapis outputu do pliku nie działa?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.
Meandry PHP
Moderator: Moderatorzy
- filips
- Forumator
- Posty: 2199
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 13 razy
- Otrzymał podziękowań: 81 razy
- Kontakt:
Meandry PHP
GeoKrety.org - darmowa alternatywa dla travelbugów
Mapa (prawie) wszystkich keszy na świecie ;) - dla garmina
Status WWW geokretów, opencaching, geocaching
Mapa (prawie) wszystkich keszy na świecie ;) - dla garmina
Status WWW geokretów, opencaching, geocaching
- sp2ong
- Forumator
- Posty: 2199
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 3 razy
- Otrzymał podziękowań: 15 razy
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.
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
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
-
- Wyjadacz
- Posty: 471
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 0
- Otrzymał podziękowań: 4 razy
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: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)
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]
- sp2ong
- Forumator
- Posty: 2199
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 3 razy
- Otrzymał podziękowań: 15 razy
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
$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
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
-
- Wyjadacz
- Posty: 471
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 0
- Otrzymał podziękowań: 4 razy
cóż. z czubka głowy nic nie wiem, jak mawiają hamerykanie. musiałbym zobaczyć kod, dane wejściowe i tak dalej :]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
jaki jest $x, $y, $thisline1 jak wygląda? jedno mogę Ci powiedzieć od razu, że nie ma sensu przekazywać 4 do f-cji pack.
- sp2ong
- Forumator
- Posty: 2199
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 3 razy
- Otrzymał podziękowań: 15 razy
no 4 uzylem tak jak podales.angelo pisze:cóż. z czubka głowy nic nie wiem, jak mawiają hamerykanie. musiałbym zobaczyć kod, dane wejściowe i tak dalej :]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
jaki jest $x, $y, $thisline1 jak wygląda? jedno mogę Ci powiedzieć od razu, że nie ma sensu przekazywać 4 do f-cji pack.
$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
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
-
- Wyjadacz
- Posty: 471
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 0
- Otrzymał podziękowań: 4 razy
ee... blefujesz ;] 4 użyłem, jako trzeciego parametru do "fwrite". jako ilości bajtów do zapisania.sp2ong pisze:no 4 uzylem tak jak podales.
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.
-
- Wyjadacz
- Posty: 471
- Rejestracja: środa 20 lutego 2008, 14:10
- Podziękował;: 0
- Otrzymał podziękowań: 4 razy
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:angelo pisze:wygląda jakby bład był gdzie indziej.
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?