Sunday 24 December 2017

Multipart content transfer encoding binary options


Im pisania prostego serwera sieci web w Pythonie, który pozwala użytkownikowi na przesyłanie pliku przy użyciu multipartform-danych. O ile mi wiadomo, multipart dane MIME ma być liniowy. Na przykład granica musi znajdować się na początku linii. Nie mogę zrozumieć, w jaki sposób binarne dane są obsługiwane w tym zakresie. Mój klient (Firefox) nie jest kodowany w 7-bitowym ASCII lub cokolwiek, tylko jego surowe dane binarne jego wysyłania. Czy dzieli dane na linie w dowolnych lokalizacjach Czy istnieje maksymalna długość linii określona dla danych wielostronnych Ive próbował przeszukiwać RFC dla wielu danych, ale nic nie znalazł. zapytał 27 marca o godzinie 16:54 Po wykopaniu RFC, myślę, że w końcu dostałem to wszystko w mojej głowie. Części ciała (tj. Zawartość ciała w pojedynczej części wiadomości wieloczęściowej) muszą mieć tylko linię, ponieważ granica na końcu części zaczyna się od CRLF. Ale w przeciwnym razie dane nie muszą być oparte na linii, a jeśli zawartość ma się w niej w linii, nie ma żadnej odległości między nimi, ani też nie trzeba ich unikać (dobrze, chyba że Content-Transfer - Kodowanie jest ciągiem znaków). 7-bitowe, 8-bitowe i binarne opcje Content-Transfer-Encoding nie wykazują, że na danych zostały wykonane wszystkie dane (a zatem nie ma potrzeby cofania kodowania), mają one właśnie wskazywać typ danych można spodziewać się zobaczyć w części ciała. To, na co miałem na myśli moje słabe pytanie, polegało na odczytywaniu danych z gniazda, dzięki czemu mogłem upewnić się, że złapałem granicę i bez konieczności posiadania arbitralnie dużego bufora (np. Jeśli nie wystąpiły błędy linii treść, a więc linia readline skończyła się buforowaniem całej rzeczy). To, co skończyło, to buforowanie z gniazda z linią readline przy użyciu maksymalnej długości, więc bufor nigdy nie był dłuższy niż ten, ale również upewnić się, że zakończy się, jeśli napotkano na linię. Zapewniło to, że kiedy nadejdzie granica (po CRLF), byłaby na początku buforu. Musiałem zrobić trochę dodatkowych monkeying dookoła, aby upewnić się, że nie zawierają tego ostatecznego CRLF w rzeczywistej treści ciała, ponieważ zgodnie z RFC jego wymagane przed granicą, a tym samym nie częścią samej treści. odpowiedziało kwi 5 13 at 12:02 Spróbuj przeanalizować RFC 2045. Zwykle zawartość binarna jest konwertowana na BASE64 przez aplikację i dołączona do wiadomości wieloczęściowej za pomocą Content-Transfer-Encoding. Base64. Istnieją inne mechanizmy przekazywania danych binarnych, ale jest to dość powszechne. Dane binarne są konwertowane na oktety i wyrysowane w długich łańcuchach długości (w zależności od wariantu kodowania - patrz łącze BASE64 powyżej). Aplikacja odbiorcza następnie dekoduje ją w oryginalnej zawartości binarnej. Nie jestem programistą Pythona, ale byłbym zaskoczony, że naprawdę musiałeś sam kodować. Podejrzewam, że istnieją wstępnie zbudowane funkcje biblioteki Pythona, aby to zrobić dla Ciebie. Odpowiedziałem, Mar 27 13 w 17:43 Dzięki, patrzyłem na inny RFC co nie było tak pouczające. Znalazłem także RFC 2046, który definiuje szczegółowe wiadomości w sekcji 5. Zauważ, że w tych RFC są nieco subtelne: mówi się, że wiadomości wielopiętrowe nie mogą mieć kodowań innych niż 7-bitowy, 8-bitowy i binarny (tj. nie Base-64). Niemniej jednak, mówi się, że poszczególne części w obrębie wielu części mogą mieć własne kodowanie treści, więc masz rację, że Base-64 jest możliwe. ndash brianmearns Mar 28 13 at 13:20 Your Answer 2017 Stack Exchange, Inc5 Pole nagłówka Content-Transfer-Encoding Wiele typów zawartości, które mogłyby być transportowane przez e-mail, są reprezentowane w naturalnym formacie jako 8-bitowy znak lub binarny dane. Te dane nie mogą być przekazywane w ramach niektórych protokołów transportowych. Na przykład RFC 821 ogranicza wiadomości e-mail do 7-bitowych danych US-ASCII o długości 1000 znaków. Konieczne jest zatem zdefiniowanie standardowego mechanizmu ponownego kodowania takich danych w formacie 7-bitowego krótkiego wiersza. Ten dokument określa, że ​​takie kodowanie zostanie wskazane przez nowy nagłówek Content-Transfer-Encoding. Pole Content-Transfer-Encoding służy do wskazania typu transformacji, która została użyta w celu reprezentowania ciała w sposób akceptowalny dla transportu. W przeciwieństwie do typów zawartości, rozpowszechnianie wartości Content-Transfer-Encoding jest niepożądane i niepotrzebne. Jednak utworzenie tylko jednego mechanizmu Content-Transfer-Encoding nie wydaje się możliwe. Istnieje potrzeba kompromisowego i wydajnego kodowania w dużej mierze danych binarnych i pragnienia czytelnego kodowania danych, które są przeważnie, ale nie w całości, 7-bitowe. Z tego powodu potrzebne są co najmniej dwa mechanizmy kodowania: czytelny kodowanie i gęste kodowanie. Pole Content-Transfer-Encoding jest przeznaczone do określania odwzorowania odwrotnego między natywną reprezentacją typu danych a reprezentacją, która może być łatwo wymieniona przy użyciu 7-bitowych protokołów transportu poczty, takich jak te zdefiniowane przez RFC 821 (SMTP). To pole nie zostało zdefiniowane przez poprzedni standard. Wartość pola to pojedynczy token określający typ kodowania, jak podano poniżej. Formalnie: te wartości nie są rozróżniane na wielkie i małe litery. Oznacza to, że Base64, BASE64 i bAsE64 są równoważne. Typ kodowania 7BIT wymaga, aby ciało było już w siedmiobitowej reprezentacji poczty. Jest to wartość domyślna, czyli Content-Transfer-Encoding: przyjmuje się, że 7BIT jest założone, jeśli pole nagłówka Content-Transfer-Encoding nie jest obecne. Wartości 8-bitowe, 7-bitowe i binarne oznaczają, że kodowanie NO zostało wykonane. Są jednak potencjalnie użyteczne jako wskazania rodzaju danych zawartych w obiekcie, a zatem rodzaju kodowania, które może być konieczne do transmisji w danym systemie transportowym. 7 bit oznacza, że ​​dane są reprezentowane jako krótkie linie danych US-ASCII. 8 bit oznacza, że ​​linie są krótkie, ale mogą występować znaki inne niż ASCII (oktety z zestawem bitów wysokiego rzędu). Binarny oznacza, że ​​nie tylko znaki inne niż ASCII są obecne, ale także że linie nie są wystarczająco krótkie, aby można było je transportować. Różnica pomiędzy 8-bitowym (lub dowolnym innym możliwym znacznikiem szerokości bitowej) a tokenem binarnym to, że binarny nie wymaga przestrzegania jakichkolwiek ograniczeń długości linii lub semantyki SMTP CRLF, a żetony o małej szerokości wymagają takiego przylegania. Jeśli ciało zawiera dane w dowolnej szerokości bitowej innej niż 7-bitowe, należy użyć odpowiedniej tokeny kodującej Content-Transfer-Encoding (na przykład 8 bitów dla 8-bitowych niezainodowanych danych). Jeśli ciało zawiera dane binarne, należy użyć binarnego znacznika kodowania treści-transfer-kod. Rozróżnienie pomiędzy wartościami Content-Transfer-Encoding binarnymi, 8 bitowymi itp. Może wydawać się nieistotne, ponieważ wszystkie one naprawdę oznaczają brak - czyli nie ma kodowania danych do transportu. Jednak wyraźne oznakowanie będzie miało ogromną wartość dla bram pomiędzy przyszłymi systemami transportu poczty, które mają różne możliwości w zakresie transportu danych, które nie spełniają ograniczeń w transporcie RFC 821. Od publikacji tego dokumentu nie ma standardowych przewozów internetowych, do których uzasadnione jest włączenie niezarządzanych 8-bitowych lub binarnych danych w korespondencji. Nie ma zatem okoliczności, w których 8-bitowy lub binarny kodowanie treści-treści jest rzeczywiście legalny w internecie. Jednak w przypadku, gdy 8-bitowy lub binarny transport poczty staje się rzeczywistością w poczcie internetowej lub gdy ten dokument jest używany w połączeniu z dowolnym innym 8-bitowym lub binarnym mechanizmem transportowym, należy oznaczyć 8-bitowe lub binarne ciało jako taki przy użyciu tego mechanizmu. Pięć wartości określonych dla pola Content-Transfer-Encoding nie sugeruje niczego innego niż algorytm, w którym został zakodowany lub wymagany jest system transportowy, jeśli nie jest to kodowane. Wdrażający mogą, jeśli to konieczne, definiować nowe wartości kodowania Content-Transfer-Encoding, ale muszą używać x-tokena, który jest nazwą poprzedzoną przez X-, aby wskazać jej niestandardowy stan, np. Content-Transfer-Encoding: x-moje-nowe-kodowanie. Jednak w przeciwieństwie do typów zawartości i podtypów, tworzenie nowych wartości kodowania Content-Transfer-Encoding jest wyraźnie i zdecydowanie zniechęcane, ponieważ prawdopodobnie utrudnia interoperacyjność z niewielkimi możliwymi korzyściami. Ich wykorzystanie jest dozwolone tylko w wyniku umowy między współpracującymi agentami użytkownika. Jeśli nagłówek nagłówka Content-Transfer-Encoding zostanie wyświetlony jako część nagłówka wiadomości, dotyczy całego całego tego komunikatu. Jeśli nagłówek nagłówka Content-Transfer-Encoding zostanie wyświetlony jako część nagłówków części ciała, dotyczy ona tylko części ciała. Jeśli jednostka jest typu wieloczęściowego lub wiadomości, kodowanie-Content-Transfer nie ma wartości innej niż szerokość bitowa (np. 7 bit, 8 bit, itd.) Lub binarne. Należy zauważyć, że e-mail jest zorientowany na charakter, więc mechanizmy opisane tutaj są mechanizmami kodowania dowolnych strumieni bajtów, a nie strumieni bitów. Jeśli strumień bitowy ma być kodowany za pomocą jednego z tych mechanizmów, najpierw musi być przekształcony w 8-bitowy bajtowy strumień przy użyciu standardowej kolejności bitowej sieciowej (big-endian), w której starsze bity w strumieniu stają się wyższymi, uporządkować bity w bajcie. Strumień bitowy nie kończący się na 8-bitowej granicy musi być wypełniony zerami. Ten dokument stanowi mechanizm do noting dodawania takiego napełniania w przypadku aplikacji Content-Type, która ma parametr wypełnienia. Mechanizmy kodowania zdefiniowane tutaj wyraźnie kodują wszystkie dane w formacie ASCII. Załóżmy na przykład, że jednostka posiada pola nagłówkowe, takie jak: To powinno być interpretowane w ten sposób, że ciało jest kodowanie ASCII bazą ASCII w standardzie ISO-8859-1 i będzie znajdować się w tym zestawie znaków ponownie po dekodowaniu . Następujące sekcje definiują dwa standardowe mechanizmy kodowania. Definicja nowych kodowań-transfer-transferów jest wyraźnie zniechęcona i powinna nastąpić tylko wtedy, gdy jest to absolutnie konieczne. Wszystkie obszary nazw kodowania transferu treści, oprócz tej, które zaczynają się od X-, są wyraźnie zastrzeżone dla IANA do wykorzystania w przyszłości. Również wyraźnie zniechęcają prywatne umowy dotyczące kodowania treści-transferu. Niektóre wartości z Content-Transfer-Encoding mogą być użyte tylko w określonych typach zawartości. W szczególności jest zabronione używanie jakichkolwiek kodowań innych niż 7bit, 8bit lub binarny z dowolnym typem zawartości, który rekurencyjnie zawiera inne pola typu Content-Type, w szczególności wielokrotne i wiadomości typu zawartości. Wszystkie szyfrowania, które są potrzebne dla obiektów typu multipart lub wiadomości muszą być wykonane na najniższym poziomie, kodując rzeczywiste ciało, które musi być zakodowane. UWAGA NA KODOWANIE OGRANICZENIACH: Chociaż zakaz używania kodowania-przenoszenia treści na danych typu wieloczęściowego lub komunikatu może wydawać się zbyt restrykcyjny, konieczne jest zapobieganie zagnieżdżonym kodowaniu, w którym dane są przekazywane wielokrotnie przez algorytm kodowania i muszą być dekodowane wielokrotnie, aby móc je prawidłowo obejrzeć. Szyfrowanie zagnieżdżone zwiększa złożoność do agentów użytkowników: poza oczywistymi problemami z wydajnością z takimi wielokrotnymi kodami mogą ukryć podstawową strukturę wiadomości. W szczególności mogą sugerować, że kilka operacji dekodowania jest konieczne po prostu, aby dowiedzieć się, jakie typy obiektów zawiera wiadomość. Zakaz zagnieżdżonych kodowań może skomplikować pracę pewnych bram poczty, ale jest to mniej problem niż wpływ zagnieżdżonych kodowań na agentach użytkowników. UWAGA NA TEMAT ZWIĄZKU MIĘDZY TYPU ZAWARTOŚCI I ZAWARTOŚCI TRANSFEROWEJ - KODOWANIE Może się wydawać, że kodowanie Content-Transfer-Encoding można wywnioskować na podstawie charakterystycznych typów zawartości, które mają być zakodowane lub co najmniej, że pewne Content-Transfer-Encodings może być upoważniony do użycia z określonymi typami zawartości. Jest kilka powodów, dla których tak się nie dzieje. Po pierwsze, biorąc pod uwagę różne rodzaje transportu używane do wysyłania poczty, niektóre zakodowania mogą być odpowiednie dla niektórych kombinacji Content-Typetransport, a nie dla innych. (Na przykład w 8-bitowym transporcie nie ma potrzeby kodowania tekstu w pewnych zestawach znaków, podczas gdy takie szyfrowania są wyraźnie wymagane w przypadku 7-bitowego SMTP). Po drugie, niektóre typy zawartości mogą wymagać różnych typów kodowania transferowego w różne okoliczności. Na przykład wiele organów PostScript może składać się w całości z krótkich wierszy 7-bitowych danych i dlatego wymagają one mało lub nie ma kodowania. Inne ciała PostScript (zwłaszcza te, które korzystają z mechanizmu kodowania binarnego PostScripts poziomu 2) mogą być reprezentowane tylko w oparciu o binarne kodowanie transportu. Wreszcie, ponieważ Content-Type ma być otwartym mechanizmem specyfikacji, ścisła specyfikacja skojarzenia między typami treści i kodowaniem skutecznie łączy specyfikację protokołu aplikacji z określonym transportem niższego szczebla. Nie jest to pożądane, ponieważ programiści typu treści nie muszą być świadomi wszystkich używanych transportów i ich ograniczeń. UWAGA NA KODOWANIACH PRZEKŁADNIOWYCH Kodowanie w nadajniku i kodowanie w formacie base64 są zaprojektowane tak, aby możliwa była konwersja między nimi. Jedyną kwestią, która powstaje w takiej konwersji jest obsługa przerw w linii. Podczas konwersji z atrybutem nadruku na bazę64 przerwa w linii musi być przekształcona w sekwencję CRLF. Podobnie, sekwencja CRLF w danych typu base64 powinna zostać przekształcona w przerwę wiersza w wierszu przeznaczoną do wydrukowania, ale tylko w przypadku konwersji danych tekstowych. UWAGA NA MODEL KODOWANIOWY: W poprzednich wersjach tej notatki pojawiły się pewne zamieszania, dotyczące modelu, w którym dane e-mail mają być konwertowane na formę kanoniczną i zakodowane, a zwłaszcza, jak ten proces miałby wpływ na traktowanie CRLF, biorąc pod uwagę, że reprezentacja nowych linii różni się znacznie od systemu do systemu. Z tego powodu kanoniczny model kodowania jest przedstawiony jako dodatek H. 5.1 Quoted-Printable Content-Transfer-Encoding Kodowane przez Quoted-Printable kodowanie służy do reprezentowania danych składających się głównie z oktetów, które odpowiadają drukowanym znakom w zestawie znaków ASCII. Koduje dane w taki sposób, że powstałe oktety nie są prawdopodobnie modyfikowane przez transport poczty. Jeśli zakodowane dane są w większości tekstami ASCII, zakodowana forma danych pozostaje w dużym stopniu rozpoznawalna przez ludzi. Ciało, które jest całkowicie ASCII, może być również zakodowane w Quoted-Printable, aby zapewnić integralność danych, jeśli wiadomość przechodzi przez translację znaków i bramę owijania linii. W tym kodowaniu oktety należy przedstawić w następujący sposób: Reguła 1: (General 8-bit representation) Każdy oktet, z wyjątkiem tych, które wskazują przerwanie linii zgodnie z konwencją nowej linii kanonicznej postaci danych zakodowanych, może być reprezentowana przez następującą po niej dwucyfrową reprezentację szesnastkową wartości oktetowej. Cyfry alfabetu szesnastkowego w tym celu to 0123456789ABCDEF. Podczas wysyłania danych szesnastkowych należy używać dużych liter, chociaż solidna implementacja może wybrać rozpoznawanie małych liter od otrzymania. Tak więc na przykład wartość 12 (kanał formularza ASCII) może być reprezentowana przez 0 ° C, a wartość 61 (ASCII EQUAL SIGN) może być reprezentowana przez 3D. Z wyjątkiem przypadków, gdy następujące reguły pozwalają na alternatywne kodowanie, ta zasada jest obowiązkowa. Reguła 2: (reprezentacja literalna) Oktaty o wartościach dziesiętnych od 33 do 60 włącznie i od 62 do 126 włącznie mogą być reprezentowane jako znaki ASCII, które odpowiadają tych oktetom (PUNKT Z WYŁĄCZENIEM przez MNIEJSZOŚĆ i DUŻO NIŻ przez TILDE odpowiednio) ). Zasada 3: (białe pola) Oktety o wartościach 9 i 32 mogą być reprezentowane jako znaki ASCII TAB (HT) i SPACE, ale NIE MUSZĄ być tak reprezentowane na końcu zakodowanej linii. Każdy znak TAB (HT) lub SPACE na zakodowanej linii MUSZĄ być następnie w tym wierszu wydrukowany znakiem. W szczególności, pod koniec zakodowanej linii, wskazując łagodną linię (patrz reguła 5), ​​może wystąpić jedno lub więcej znaków TAB (HT) lub SPACE. Wynika z tego, że oktet o wartości 9 lub 32 pojawiającej się na końcu zakodowanej linii musi być reprezentowany zgodnie z regułą 1. Ta reguła jest konieczna, ponieważ niektóre MTA (Agenci transportu wiadomościami, programy przenoszące wiadomości z jednego użytkownika na inny lub wykonują część takich transferów) są znane z linii tekstowych zawierających SPACE, a inne znają usuwanie znaków odstępu od końca wiersza. Dlatego przy dekodowaniu ciała cytowanego do wydruku każda biała przestrzeń końcowa na linii musi zostać usunięta, ponieważ będzie ona koniecznie dodawana przez pośrednie środki transportu. Reguła 4 (przerwania wierszy) Przerwanie wiersza części treści tekstu, niezależne od tego, co reprezentuje za kanoniczną reprezentacją zakodowanych danych, musi być reprezentowane przez przerwanie linii (RFC 822), która jest sekwencją CRLF w kodowanie w formacie Quoted - Printable. Jeśli izolowane CR i LF lub sekwencje LF CR i CR LF mogą pojawić się w danych binarnych zgodnie z formą kanoniczną, muszą być reprezentowane odpowiednio 0D, 0A, 0A0D i 0D0A. Zauważ, że wiele implementacji może wybrać kodowanie lokalnej reprezentacji różnych typów treści bezpośrednio. W szczególności może to dotyczyć materiałów tekstowych na systemach używających konwencji nowej linii, innych niż separatory CRLF. Taka implementacja jest dopuszczalna, ale generowanie przerw w linii musi być uogólnione w celu uwzględnienia przypadków, w których wykorzystywane są alternatywne reprezentacje sekwencji nowej linii. Reguła 5 (łagodne przerwy) Kodowane - drukowane kodowanie WYMAGA, że zakodowane linie nie mogą mieć więcej niż 76 znaków. Jeśli dłuższe linie mają być szyfrowane kodowaniem kwerendowo-drukowanym, muszą być użyte miękkie linie. Znak równy znakowi ostatniego znaku na zakodowanej linii wskazuje na taką nieznaczną (łagodną) linię w zakodowanym tekście. Tak więc, jeśli surowa forma linii jest pojedynczą niekodowaną linią, która mówi: "To może być reprezentowane w Quoted-Printable kodowanie, ponieważ zapewnia mechanizm, z którymi długie linie są zakodowane w taki sposób, aby przywrócić przez użytkownika agent. Limit 76 znaków nie liczy końcowego znaku CRLF, ale liczy wszystkie inne znaki, łącznie z równymi znakami. Ponieważ znak liczby przerywników (-) jest reprezentowany jako sam w kodzie referencyjnym Quoted-Printable, należy zadbać o to, aby podczas pakowania zaszyfrowanego nadrukowanego korpusu w jednostce wielopiętrowej w celu zapewnienia, że ​​granica kapsułkowania nie pojawia się w zakodowanym korpusie . (Dobra strategia polega na wybraniu granicy, która zawiera sekwencję znaków, taką jak ta, która nigdy nie może się pojawić w nadrukowanym korpusie. Zobacz definicję wieloczęściowych komunikatów w dalszej części tego dokumentu). UWAGA: Kodowanie w cudzysłowie reprezentuje coś w rodzaju kompromis pomiędzy czytelnością a niezawodnością w transporcie. Korpusy zakodowane kodowanym przez drukowane kodem działają niezawodnie w większości bram poczty, ale mogą nie działać perfekcyjnie przez kilka bram, zwłaszcza tych, które dotyczą tłumaczenia na EBCDIC. (Teoretycznie brama EBCDIC może dekodować nadrukowany obiekt i ponownie kodować go przy użyciu bazy64, ale takie bramy jeszcze nie istnieją). Wyższy poziom zaufania jest oferowany przez Base64 Content-Transfer-Encoding. Aby uzyskać rozsądny transport poprzez bramki EBCDIC, należy również zacytować znaki ASCII zgodnie z regułą 1. Więcej informacji można znaleźć w dodatku B. Ze względu na to, że dane z nadrukowanego wiersza są na ogół zakładane jako zorientowane na linie, należy spodziewać się, że przerwy między wierszami cytowanych drukowalnych danych mogą być zmienione w transporcie, w ten sam sposób, że zwykła poczta tekstowa zawsze zmieniała się w poczcie internetowej przechodząc między systemami o różnej konwencji nowej linii. Jeśli takie zmiany mogą powodować zepsucie danych, prawdopodobnie bardziej sensowne jest używanie kodowania base64, a nie kodowania podanego w cudzysłowie. 5.2 Kodowanie-transferowanie zawartości Base64 Kodowanie-transfer-kodowanie Base64 jest zaprojektowane do reprezentowania dowolnych sekwencji oktetów w postaci, która nie jest czytelna dla ludzi. Algorytmy kodowania i dekodowania są proste, ale zakodowane dane są stale tylko o 33 procent większe od niezhodowanych danych. To kodowanie jest oparte na tej, która jest używana w aplikacjach z rozszerzoną ochroną prywatności, zgodnie z RFC 1113. Kodowanie base64 jest adaptowane z RFC 1113, z jedną zmianą: base64 eliminuje mechanizm osadzania czystego tekstu. Stosuje się 65-znakowy podzbiór US-ASCII, umożliwiający przedstawianie 6 bitów na każdy znak drukowany. (Dodatkowy 65-znakowy znak, używany do oznaczenia specjalnej funkcji przetwarzania). UWAGA: Ten podzbiór ma ważną właściwość, którą reprezentuje się identycznie we wszystkich wersjach ISO 646, w tym US ASCII, a wszystkie znaki w podzbiorze są również reprezentowane identyczne we wszystkich wersjach EBCDIC. Inne popularne szyfrowania, takie jak kodowanie używane przez narzędzie UUENCODE i kodowanie base85 określone jako część PostScriptu poziomu 2, nie mają tych właściwości, a zatem nie spełniają wymogów dotyczących przenośności, musi spełniać binarne kodowanie transportu dla poczty. Proces kodowania reprezentuje 24-bitowe grupy bitów wejściowych jako ciągi wyjściowe 4 znaków zakodowanych. Przechodząc od lewej do prawej, 24-bitowa grupa wejściowa jest tworzona przez łączenie 3 8-bitowych grup wejściowych. Te 24 bity są następnie traktowane jako 4 połączone 6-bitowe grupy, z których każdy jest tłumaczony na jedną cyfrę w alfabecie base64. Podczas kodowania strumienia bitów za pomocą kodowania base64 należy najpierw przypuszczać, że strumień bitów został zamówiony z najbardziej znaczącym bitem. Oznacza to, że pierwszym bitem w strumieniu będzie bit wysokiego rzędu w pierwszym bajcie, a ósmy bit będzie bitem niskiego rzędu w pierwszym bajcie i tak dalej. Każda 6-bitowa grupa jest używana jako indeks w tablicy 64 znaków drukowanych. Znak, do którego odwołuje się indeks, jest umieszczony w ciągu znaków wyjściowych. Znaki wymienione w tabeli 1 poniżej są wybierane tak, aby były uniwersalnie reprezentatywne, a zestaw wyklucza znaki o szczególnym znaczeniu dla SMTP (np. CR, LF) i granicach kapsułkowania zdefiniowanych w tym dokumencie (np. -) . Tabela 1: Alfabet Base64 Strumień wyjściowy (zakodowane bajty) musi być reprezentowany nie więcej niż 76 znaków. Wszystkie podziały wierszy lub inne znaki niewymienione w tabeli 1 muszą zostać zignorowane przez oprogramowanie dekodujące. W danych podstawowych64 znaki inne niż w tabeli 1, przerwaniach linii i inne białe spacje prawdopodobnie wskazują błąd transmisji, w którym w pewnych okolicznościach może być odpowiedni komunikat ostrzegawczy lub nawet odrzucenie wiadomości. Specjalne przetwarzanie jest wykonywane, jeśli na końcu zakodowanych danych są dostępne mniej niż 24 bity. Pełny kodowany kwant jest zawsze wypełniony na końcu ciała. Jeśli w grupie wejściowej dostępnych jest mniej niż 24 bity wejściowe, po prawej stronie dodawane są bity zerowe, aby utworzyć liczbę całkowitą 6-bitowych grup. Pozycje znaków wyjściowych, które nie są wymagane do reprezentowania rzeczywistych danych wejściowych, są ustawiane na znak. Ponieważ wszystkie wejścia bazy64 są integralną liczbą oktetów, może dojść do powstania tylko następujących przypadków: (1) końcowy kwantum wejścia kodującego to integralna wielokrotność 24 bitów, ostatnia jednostka kodowanego wyjścia będzie integralną wielokrotnością 4 znaków (2) końcowe kwantowanie wejściowego kodowania to dokładnie 8 bitów, ostatnia jednostka kodowanego wyjścia będzie miała dwa znaki, a następnie dwa znaki wypełnienia, lub (3) końcowy kwant kwantowy wejścia kodującego to dokładnie 16 bitów tutaj , ostatnią jednostką kodowanego wyjścia będzie trzy znaki, a następnie jeden znak dopełnienia. Należy zachować ostrożność, aby używać poprawnych oktetów do przerwania wierszy, jeśli kodowanie w formacie base64 jest stosowane bezpośrednio do materiałów tekstowych, które nie zostały przekształcone w formę kanoniczną. W szczególności przerwy w wierszach tekstowych należy przekształcić w sekwencje CRLF przed kodowaniem w formacie base64. Warto zauważyć, że może to być dokonane bezpośrednio przez kodera, a nie w poprzednim kroku kanonizacji w niektórych implementacjach. UWAGA: Nie musisz się martwić o cytowanie pozornych granic kapsułkowania wewnątrz zakodowanych w base64 części wielopiętych elementów, ponieważ w kodowaniu base64 nie użyto znaków dzielenia. Encent-Transfer-Encoding: 8 bit dodawany nieprawidłowo do nagłówków wieloczęściowych wiadomości e-mail z obrazami w wierszach Kiedy odpowiadając na wiadomość HTML na liście, pierwotnie cytowana wiadomość jest renderowana jako zarówno poprawna wersja zwykłego tekstu, jak i zwykłe renderowanie tekstu źródłowego HTML w wersji HTML wiadomości i zwykłe kodowanie w formacie Base64 wszystkich obrazów inline. To zachowanie udokumentowane dotychczas w wiadomościach wysyłanych z Postbox 3.05 dla systemu Mac OS X, z obrazem w wierszu będącym obrazem profilu nadawcy z książki adresowej, a podstawowym formatowaniem wiadomości HTML. Potwierdzenie, jeśli jest to specyficzne dla tego programu pocztowego. babbage Credit Attribution: babbage commented September 8, 2017 at 9:40 am Cytowane wiadomości HTML są renderowane inline jako zwykłe wersje tekstowe kodu Obrazy w wierszu są renderowane jako zwykłe wersje tekstu kodu Potwierdzono, że ten problem nie występuje, jeśli wyłączysz preferencje Postbox , Dołączając zdjęcia kontaktowe do każdego uczestnika podczas podsumowania, co prowadzi do części w wieloczęściowym e-mailu HTML z imagejpeg: Więc problem ten prawdopodobnie ogranicza się do sytuacji, gdy obraz w wierszu jest zawarty w wiadomości grupowej. babbage Credit Attribution: babbage commented September 8, 2017 at 9:51 pm Potwierdzono, że nie ma problemu podczas wysyłania wiadomości do listy standardowym plikiem jpg jako załącznikiem, a nie inline. (Może to być wyświetlane w wierszu, w zależności od klienta poczty). Potwierdzony obraz w wierszu w pierwotnej wiadomości powoduje, że dokument HTML i imagejpeg jest renderowany jako zwykły tekst w wysłanej wiadomości, więc nie jest to ograniczone do odpowiedzi na wiadomości. babbage Credit Attribution: babbage commented September 8, 2017 at 9:59 am Problem występuje z sekcji ogmailinglisttransport. inc w c. wiersz 908 (numer linii mógł się zmienić dzięki mojej pracy w pliku), w sekcji, która się rozpoczyna: jest to sekcja kodu, która wydaje się powodować ten problem. Wiadomości e-mail z obrazami w wierszu mają nagłówki, takie jak: Content-Type: multipartmixed boundaryDrupal-OG-Mailinglist - 1143534839 charsetUTF-8 Emaile bez problemu nie mają granic ArtykułDrupal-OG-Mailinglist - 1143534839, a zamiast tego mają coś takiego: Content-Type: multipartmixed granica ------------ 050107000403000604050201 charsetUTF-8 Oczywiście, dokładny charakter granicy prawdopodobnie nieco wysyła specyficzne dla klienta poczty e-mail, ale wydaje się to zawęzić do problemu w tworzeniu nowej jednostki MIME, jak wskazano powyżej. babbage Credit Attribution: babbage komentowane 8 września 2017 o 10:19 am Hmm. Emaile z tym problemem mają następującą strukturę nagłówka: Oznacza to, że główny nagłówek określa, że ​​Content-Transfer-Encoding wynosi 8 bitów (i UTF-8), ale każda podsekcja stwierdza, że ​​jest to 7 bitów (i ISO-8859-1 w przypadku tych wiadomości). Im myśląc 8bit7bit rozbieżności może być problemem tutaj babbage Credit Attribution: babbage komentowane 8 września 2017 o 21:10 Jeśli nagłówek Content-Transfer-Encoding pojawi się jako część nagłówka wiadomości, dotyczy całego ciała tej wiadomości . Jeśli nagłówek nagłówka Content-Transfer-Encoding zostanie wyświetlony jako część nagłówków części ciała, dotyczy ona tylko części ciała. Jeśli jednostka jest typu wieloczęściowego lub wiadomości, kodowanie-Content-Transfer nie ma wartości innej niż szerokość bitowa (np. 7 bit, 8 bit, itd.) Lub binarne. Tak więc obecność wyraźnej specyfikacji 8-bitowej w nagłówku jest nadrzędna w specyfikacji 7-bitowej w wiadomości wieloczęściowej. Nawet brak jakiegokolwiek kodu Content-Transfer-Encoding w nagłówku uniemożliwiłoby ten problem, zarówno dlatego, że zastosowano specyfikacje części ciała, ale także dlatego, że ten sam dokument określa, że ​​7 bit jest domyślnym, jeśli kodowanie nie zostało określone.

No comments:

Post a Comment