Wybieram format pliku i chcę to zrobić poprawnie. Ponieważ jest to format binarny, pierwszy bajt (lub bajty) pliku nie powinien tworzyć prawidłowych znaków tekstowych (tak jak w nagłówku 1 pliku PNG ). Dzięki temu narzędzia, które nie rozpoznają formatu, mogą zobaczyć, że nie jest to plik tekstowy, patrząc na kilka pierwszych bajtów.
Każdy punkt kodowy powyżej 0x7Fjest nieprawidłowy US-ASCII, więc to proste. Ale dla Unicode to zupełnie inna historia. Oprócz prawidłowych znaków Unicode są też znaki prywatnego użytku , non - charar i sentinels , jak znalazłem w FAQ dla Unicode prywatnych znaków, non-charar i Sentinels .
Jaka byłaby sekwencja wartowników, których mogłabym użyć na początku pliku, co spowodowałoby nieprawidłowe US-ASCII, UTF-8, UTF-16LE i UTF-16BE?
- Oczywiście pierwszy bajt nie może mieć wartości poniżej,
0x80ponieważ byłby to prawidłowy znak US-ASCII (kontrolny), więc0x00nie można go użyć. - Ponadto, ponieważ znaki do użytku prywatnego są prawidłowymi znakami Unicode, nie mogę również używać tych znaków kodowych.
- Ponieważ musi działać zarówno z UTF-16 little-endian, jak i big-endian, znak taki jak
0xFFFErównież nie jest możliwy, ponieważ jego odwrotność0xFEFFjest poprawnym znakiem Unicode. - Wyżej wspomniane FAQ sugeruje, aby nie używać żadnych znaków innych niż znaki, ponieważ nadal skutkowałoby to prawidłową sekwencją Unicode, więc coś podobnego
0xFFFFrównież nie wchodzi w grę .
Jakich przyszłych wartości wartowniczych pozostawiłbym do wykorzystania?
1 ) Format PNG ma jako pierwszy bajt wartość inną niż ASCII 0x89, po której następuje łańcuch PNG. Narzędzie, które odczytuje kilka pierwszych bajtów PNG, może stwierdzić, że jest to plik binarny, ponieważ nie może interpretować 0x89. Z drugiej strony plik GIF zaczyna się bezpośrednio od prawidłowego i czytelnego ciągu ASCII, GIFpo którym następują trzy kolejne prawidłowe znaki ASCII. W przypadku GIF narzędzie może stwierdzić, że jest to czytelny plik tekstowy. To źle, a pomysł uruchomienia pliku z nieteksturalną sekwencją bajtów przyszedł od Designing File Formats autorstwa Andy'ego McFaddena.
GIF8. Plik movi SGI zaczyna się od MOVI. Rozpoczyna się jeden styl pliku archiwum zip ZZ, od bardziej popularnego formatu pkzip PK. Ograniczenie, że pierwszy bajt jest niepoprawnym znakiem tekstowym, wydaje się nie pasować do tego, co można znaleźć na wolności. Jestem ciekawy, dlaczego jest to wymóg.
Since it is a binary format, the first bytes of the file should not form valid textual characters- Powinieneś spojrzeć na magiczny plik (/ usr / share / magic lub / etc / magic na wielu systemach uniksowych), który pokazuje, jak ta aplikacja identyfikuje typy plików. Plik PNG zaczyna się od\x89PNG\x0d\0a\x1a\x0a- zwróć uwagę na „PNG”, który jest nieprzetworzonym ciągiem. Sekwencje\x89i tym podobne są bajtami, których nie można wydrukować.