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 0x7F
jest 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,
0x80
ponieważ byłby to prawidłowy znak US-ASCII (kontrolny), więc0x00
nie 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
0xFFFE
również nie jest możliwy, ponieważ jego odwrotność0xFEFF
jest 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
0xFFFF
ró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, GIF
po 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\x89
i tym podobne są bajtami, których nie można wydrukować.