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.
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ć.GIF8
. Plik movi SGI zaczyna się odMOVI
. Rozpoczyna się jeden styl pliku archiwum zipZZ
, od bardziej popularnego formatu pkzipPK
. 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.Odpowiedzi:
0xDC 0xDC
źródło
0x00
lub cokolwiek, ale operacja tego nie chciała.W UTF-8 bajty C0, C1 i F5 - FF są nielegalne. Pierwszy bajt musi być albo ASCII, albo bajtem z zakresu C2-F4, żaden inny bajt początkowy jest nieprawidłowy UTF-8.
W UTF-16 plik zwykle zaczyna się od znaku kolejności bajtów (U + FEFF), w przeciwnym razie aplikacje muszą odgadnąć kolejność bajtów. Punkty kodowe w zakresie D800-DBFF są bajtami wiodącymi dla pary zastępczej, a DC00-DFFF są bajtami końcowymi dla pary zastępczej.
Tak więc użyłbym kombinacji bajtów
F5DC
. Te dwie wartości to:Jeśli potrzebujesz więcej opcji,
F5DD
aż poF5DF
wszystkie mają te same właściwości 3, a nieF6DC
-F6DF
,F7DC
-F7DF
iF8DC
-F8DF
, w sumie 16 różnych combo bajtowych do wyboru.źródło
0xDC
czy byłby ważny UTF-8?0xDC
jest wiodącym bajtem UTF-8 dla sekwencji 2-bajtowej. Po nim musi być10xxxxxx
bajt kontynuacji, aby był ważny.0xDC
nie jest poprawnym bajtem kontynuacji, więc0xDC 0xDC
nie jest poprawny UTF-8.80
-BF
.Jeśli próbujesz użyć znaku niedrukowalnego do oznaczenia „nie tekst”, trudno będzie pokonać 0x89:
Zasadniczo, kiedy tworzysz magiczne liczby, „nietekstowy” jest drobną kwestią. Będę musiał sprawdzić referencje, ale jeden ze standardowych formatów graficznych (chyba TIFF) zawiera coś w rodzaju sześciu różnych przydatnych informacji z magicznej liczby.
źródło