Sunday 30 July 2017

Multipart เนื้อหา การถ่ายโอน การเข้ารหัส ไบนารี ตัวเลือก


Im เขียนเว็บเซิร์ฟเวอร์ง่ายๆในหลามที่ช่วยให้ผู้ใช้อัปโหลดไฟล์โดยใช้ข้อมูล multipartform เท่าที่ฉันสามารถบอกได้ข้อมูล MIME multipart ควรจะเป็นบรรทัดตาม ยกตัวอย่างเช่นเขตแดนจะต้องอยู่ที่จุดเริ่มต้นของเส้น ฉันลาดเทตัวเลขวิธีการจัดการข้อมูลไบนารีในเรื่องนี้ ลูกค้าของฉัน (Firefox) ไม่ได้เข้ารหัสเป็น ASCII 7 บิตหรือข้อมูลใด ๆ ที่เป็นข้อมูลไบนารีดิบเพียงการส่งของ มีการแบ่งข้อมูลออกเป็นเส้นตรงตามตำแหน่งใด ๆ มีความยาวเส้นสูงสุดที่ระบุไว้สำหรับข้อมูลหลายส่วน Ive พยายามมองหา RFC สำหรับข้อมูลหลายส่วน แต่ไม่พบอะไร ถาม 27 มีนาคม 13 เวลา 16:54 หลังจากขุดผ่าน RFCs ฉันคิดว่าฉันจนได้มันทั้งหมดตรงในหัวของฉัน ส่วนของร่างกาย (เช่นเนื้อหาเนื้อหาของแต่ละส่วนในข้อความแบบหลายส่วน) จะต้องเป็นบรรทัดเดียวตามที่ขอบเขตในตอนท้ายของส่วนเริ่มต้นด้วย CRLF แต่มิฉะนั้นข้อมูลไม่จำเป็นต้องเป็นบรรทัดฐานและถ้าเนื้อหาเกิดขึ้นมีการแพร่กระจายในระบบไม่มีระยะห่างสูงสุดระหว่างพวกเขาและไม่จำเป็นต้องหลบหนีในที่ใด ๆ (ดีเว้นแต่ Content-Transfer - การเข้ารหัสถูกยกมาเป็นสตริง) ตัวเลือก 7 บิต 8 บิตและไบนารีสำหรับ Content-Transfer-Encoding ไม่ได้ระบุว่ามีการเข้ารหัสใด ๆ ในข้อมูลใด ๆ (ดังนั้นจึงไม่จำเป็นต้องยกเลิกการเข้ารหัส) พวกเขาก็หมายถึงการระบุชนิดของข้อมูลเท่านั้น คุณสามารถคาดหวังที่จะเห็นในส่วนของร่างกาย สิ่งที่ฉันได้จริงๆที่ได้รับในคำถามแสดงไม่ดีของฉันคือวิธีอ่านบัฟเฟอร์ข้อมูลจากซ็อกเก็ตเพื่อให้ฉันสามารถตรวจสอบว่าฉันจับขอบเขตและโดยไม่ต้องมีบัฟเฟอร์ขนาดใหญ่โดยพลการ (เช่นถ้ามีเกิดขึ้นจะไม่มี linebreaks ใน เนื้อหาและเพื่อ readline สิ้นสุด buffering สิ่งทั้งหมด) สิ่งที่ฉันสิ้นสุดการทำคือ buffering จากซ็อกเก็ตกับ readline ใช้ความยาวสูงสุดดังนั้นบัฟเฟอร์จะไม่นานกว่านั้น แต่ยังจะให้แน่ใจว่าจะยุติถ้า linebreak พบ นี้มั่นใจได้ว่าเมื่อขอบเขตมา (ตาม CRLF) ก็จะเป็นที่จุดเริ่มต้นของบัฟเฟอร์ ฉันต้องทำ monkeying พิเศษเล็กน้อยรอบเพื่อให้แน่ใจว่าฉันไม่ได้รวม CRLF สุดท้ายในเนื้อหาของร่างกายที่เกิดขึ้นจริงเพราะตาม RFC ที่จำเป็นก่อนที่ขอบเขตและดังนั้นจึงไม่เป็นส่วนหนึ่งของเนื้อหาตัวเอง ตอบ 5 พ. ค. เวลา 13:02 น. ลองทบทวน RFC 2045 โดยปกติเนื้อหาไบนารีจะถูกแปลงเป็น BASE64 โดยแอปพลิเคชันของคุณและรวมอยู่ในข้อความหลายส่วนโดยใช้ Content-Transfer-Encoding Base64 มีกลไกอื่น ๆ ในการถ่ายโอนข้อมูลไบนารี แต่นี่เป็นเรื่องปกติธรรมดา ข้อมูลไบนารีจะถูกแปลงเป็น octets และแยกออกเป็นสตริงที่ยาวตามความยาว (ขึ้นอยู่กับรูปแบบการเข้ารหัส - ดูลิงก์ BASE64 ด้านบน) แอ็พพลิเคชันที่รับจะถอดรหัสมันลงในเนื้อหาไบนารีต้นฉบับ ฉันไม่ได้เป็นโปรแกรมเมอร์หลาม แต่ฉันจะแปลกใจที่คุณต้องมีรหัสนี้ด้วยตัวคุณเอง ฉันสงสัยว่ามีฟังก์ชั่นไลบรารีไพ ธ อนที่ทำไว้ล่วงหน้าเพื่อทำสิ่งนี้ให้กับคุณ ตอบ 27 มีนาคม 13 ที่ 17:43 ขอบคุณผมกำลังมองหาที่แตกต่างกัน RFC ซึ่งไม่เป็นข้อมูล นอกจากนี้ฉันยังพบ RFC 2046 ซึ่งกำหนดข้อความส่วนมากในส่วนที่ 5 โปรดทราบว่ามีความละเอียดอ่อนเล็กน้อยใน RFCs เหล่านี้ซึ่งทำให้ฉันไม่ได้กล่าวว่าข้อความ multipart ไม่สามารถเข้ารหัสอื่น ๆ ได้เช่น 7 บิต 8 บิตและไบนารี (ไม่ใช่ Base-64) อย่างไรก็ตามกล่าวต่อไปว่าแต่ละส่วนภายในหลายส่วนอาจมีการเข้ารหัสเนื้อหาของตัวเองดังนั้นคุณจึงแก้ไขได้ว่า Base-64 เป็นไปได้ ndash brianmearns Mar 28 13 at 13:20 คำตอบของคุณ 2017 Stack Exchange, Inc5 Content-Transfer-Encoding Header Field หลาย Content-Types ซึ่งเป็นประโยชน์ในการขนส่งผ่านทางอีเมลจะถูกแสดงเป็นรูปแบบธรรมชาติเป็นอักขระ 8 บิตหรือไบนารี ข้อมูล. ข้อมูลดังกล่าวไม่สามารถส่งผ่านโปรโตคอลการขนส่งบางประเภทได้ ตัวอย่างเช่น RFC 821 จำกัด ข้อความเมลให้เป็นข้อมูล US-ASCII แบบ 7 บิตที่มีอักขระ 1000 ตัว ดังนั้นจึงจำเป็นต้องกำหนดกลไกมาตรฐานสำหรับการเข้ารหัสข้อมูลดังกล่าวอีกครั้งในรูปแบบบรรทัดสั้น 7 บิต เอกสารนี้ระบุว่าการเข้ารหัสดังกล่าวจะระบุโดยฟิลด์ส่วนหัว Content Transfer-Encoding ใหม่ ฟิลด์ Content-Transfer-Encoding ใช้เพื่อระบุชนิดของการแปลงที่ใช้เพื่อแสดงถึงร่างกายในลักษณะที่ยอมรับได้สำหรับการขนส่ง แตกต่างจาก Content-Types การแพร่กระจายของ Content-Transfer - Encoding ไม่เป็นที่พึงปรารถนาและไม่จำเป็น อย่างไรก็ตามการสร้างกลไกการเข้ารหัสเนื้อหา - การเข้ารหัสเพียงอย่างเดียวดูเหมือนจะไม่เป็นไปได้ มีความแตกต่างระหว่างความต้องการในการเข้ารหัสข้อมูลไบนารีที่มีขนาดกะทัดรัดและมีประสิทธิภาพและต้องการเข้ารหัสข้อมูลที่อ่านได้ซึ่งเป็นข้อมูลส่วนใหญ่ แต่ไม่ใช่ข้อมูล 7 บิต ด้วยเหตุนี้จึงจำเป็นต้องใช้กลไกการเข้ารหัสอย่างน้อย 2 ตัว ได้แก่ การเข้ารหัสที่อ่านได้และการเข้ารหัสแบบหนาแน่น ฟิลด์ Content-Transfer-Encoding ได้รับการออกแบบมาเพื่อระบุการแม็ปแบบ invertible ระหว่างการแสดงชนิดข้อมูลและการแทนที่สามารถแลกเปลี่ยนได้อย่างง่ายดายโดยใช้โปรโตคอลการขนส่งอีเมล 7 บิตเช่นที่กำหนดโดย RFC 821 (SMTP) ฟิลด์นี้ไม่ได้ถูกกำหนดโดยมาตรฐานก่อนหน้าใด ๆ ค่าของฟิลด์คือโทเค็นเดี่ยวระบุประเภทของการเข้ารหัสตามที่ระบุด้านล่าง อย่างเป็นทางการ: ค่าเหล่านี้ไม่สำคัญต่อกรณี นั่นคือ Base64 และ BASE64 และ bAsE64 ต่างกันทั้งหมด ประเภทการเข้ารหัสของ 7BIT ต้องการให้ร่างกายมีอยู่แล้วในการแสดงอีเมลพร้อมใช้งานแบบ 7 บิต นี่คือค่าดีฟอลต์ - นั่นคือ Content-Transfer-Encoding: 7BIT จะสันนิษฐานได้ถ้าฟิลด์ส่วนหัว Content-Transfer-Encoding ไม่มีอยู่ ค่า 8 บิต, 7 บิตและไบนารีทั้งหมดหมายความว่าไม่มีการเข้ารหัส อย่างไรก็ตามอาจเป็นประโยชน์ในการบ่งชี้ชนิดของข้อมูลที่มีอยู่ในวัตถุและจากชนิดของการเข้ารหัสที่อาจจำเป็นต้องทำเพื่อการส่งผ่านในระบบการขนส่งที่กำหนด 7 บิตหมายความว่าข้อมูลทั้งหมดจะแสดงเป็นข้อมูลสั้น ๆ ของข้อมูล US-ASCII 8 บิตหมายความว่าบรรทัดสั้น ๆ แต่อาจมีอักขระที่ไม่ใช่ ASCII (octets ที่มีชุดบิตสูงสั่งซื้อ) ไบนารีหมายความว่าไม่เพียง แต่ตัวอักษรที่ไม่ใช่ ASCII เท่านั้นที่สามารถนำมาใช้งานได้ แต่ยังหมายถึงว่าบรรทัดไม่จำเป็นต้องสั้นพอสำหรับการส่งผ่าน SMTP ความแตกต่างระหว่าง 8bit (หรือโทเค็นที่เป็นไปได้อื่น ๆ ) กับไบนารีโทเค็นคือไบนารีไม่จำเป็นต้องยึดมั่นกับข้อจำกัดความยาวของเส้นหรือความหมายของ SMTP CRLF ในขณะที่โทเค็นความกว้างบิตต้องการการยึดมั่นดังกล่าว ถ้าเนื้อหาประกอบด้วยข้อมูลในความกว้างบิตอื่นที่ไม่ใช่ 7 บิตต้องใช้โทเค็นการเข้ารหัสเนื้อหาที่มีความกว้างบิตที่เหมาะสม (เช่น 8 บิตสำหรับข้อมูลที่ไม่ได้เข้ารหัส 8 บิต) ถ้าเนื้อหามีข้อมูลไบนารีต้องใช้โทเค็นการเข้ารหัสเนื้อหา - การเข้ารหัสไบนารี ความแตกต่างระหว่างค่า Content-Transfer-Encoding ของไบนารี 8 บิตเป็นต้นอาจดูเหมือนไม่สำคัญโดยที่ข้อมูลทั้งหมดไม่มีความหมายอย่างแท้จริงนั่นคือไม่มีการเข้ารหัสข้อมูลสำหรับการขนส่ง อย่างไรก็ตามการติดฉลากอย่างชัดเจนจะมีมูลค่ามหาศาลสำหรับเกตเวย์ระหว่างระบบการรับส่งจดหมายในอนาคตที่มีความสามารถที่แตกต่างกันในการขนส่งข้อมูลที่ไม่เป็นไปตามข้อ จำกัด ของการขนส่ง RFC 821 เนื่องจากการเผยแพร่เอกสารนี้ไม่มีการขนส่งทางอินเทอร์เน็ตที่เป็นมาตรฐานซึ่งถูกต้องตามกฎหมายรวมถึงข้อมูลไบนารี 8 บิตหรือไบนารีที่ไม่มีการเข้ารหัสในจดหมาย ดังนั้นจึงไม่มีสถานการณ์ใดที่ 8 บิตหรือเลขฐานสอง Content-Transfer-Encoding เป็นจริงทางกฎหมายบนอินเทอร์เน็ต อย่างไรก็ตามในกรณีที่การส่งอีเมลแบบ 8 บิตหรือแบบไบนารีกลายเป็นความจริงในจดหมายทางอินเทอร์เน็ตหรือเมื่อเอกสารนี้ใช้ร่วมกับกลไกการขนส่งแบบ 8 บิตหรือแบบไบนารีอื่น ๆ ควรมีป้ายกำกับ 8 บิตหรือไบนารี เช่นใช้กลไกนี้ ค่าที่กำหนดห้าสำหรับฟิลด์ Content-Transfer-Encoding จะไม่มีผลใด ๆ เกี่ยวกับ Content-Type นอกเหนือจากอัลกอริทึมที่เข้ารหัสหรือต้องการระบบการขนส่งถ้าไม่มีการเข้ารหัส ผู้ให้บริการอาจกำหนดค่าการเข้ารหัส - การเข้ารหัส - เนื้อหาใหม่หากจำเป็นต้องระบุ แต่ต้องใช้ x-token ซึ่งเป็นชื่อที่นำหน้าด้วย X - เพื่อระบุสถานะที่ไม่ได้มาตรฐานเช่น Content-Transfer-Encoding: x-my-new-encoding อย่างไรก็ตามแตกต่างจากประเภทเนื้อหาและชนิดย่อยการสร้างค่า Content-Transfer-Encoding ใหม่เป็นสิ่งที่ชัดเจนและท้อแท้อย่างมากเนื่องจากดูเหมือนว่าจะเป็นอุปสรรคต่อการทำงานร่วมกันซึ่งอาจเป็นประโยชน์ การใช้งานของพวกเขาจะได้รับอนุญาตเฉพาะตามข้อตกลงระหว่างผู้ใช้งานที่ร่วมมือ หากช่องส่วนหัว Content-Transfer-Encoding ปรากฏเป็นส่วนหนึ่งของส่วนหัวของข้อความระบบจะใช้กับเนื้อหาทั้งหมดของข้อความนั้น หากฟิลด์ส่วนหัว Content-Transfer-Encoding ปรากฏเป็นส่วนหัวของส่วนหัวของร่างกายส่วนนี้จะใช้กับส่วนของร่างกายเท่านั้น หากเอนทิตีเป็นประเภท multipart หรือข้อความ Content-Transfer-Encoding ไม่ได้รับอนุญาตให้มีค่าอื่นนอกเหนือจากความกว้างบิต (เช่น 7bit, 8bit ฯลฯ ) หรือไบนารี ควรสังเกตว่าอีเมลเป็นแบบเน้นอักขระเพื่อให้กลไกที่อธิบายไว้ในที่นี้มีกลไกในการเข้ารหัสสตรีมไบต์โดยพลการไม่ใช่สตรีมบิต ถ้าบิตสตรีมมีการเข้ารหัสผ่านทางกลไกใดกลไกหนึ่งต้องแปลงเป็นไบต์ 8 บิตโดยใช้คำสั่งบิตมาตรฐานของเครือข่าย (big-endian) ซึ่งบิตก่อนหน้าในสตรีมจะกลายเป็น high - order bits ในไบต์ กระแสบิตที่ไม่สิ้นสุดที่ขอบเขต 8 บิตจะต้องมีการเบาะด้วย zeroes เอกสารนี้มีกลไกในการสังเกตการเพิ่ม padding ดังกล่าวในกรณีของ Application Content-Type ซึ่งมีพารามิเตอร์ padding กลไกการเข้ารหัสที่กำหนดไว้ในที่นี้จะเข้ารหัสข้อมูลทั้งหมดใน ASCII อย่างชัดเจน ตัวอย่างเช่นสมมติว่าเอนทิตีมีฟิลด์ส่วนหัวเช่น: ควรตีความหมายว่าเนื้อหาเป็นข้อมูลเข้ารหัส ASCII ของ base64 ที่อยู่ใน ISO-8859-1 และจะอยู่ในชุดอักขระนั้นอีกครั้งหลังจากถอดรหัส . ส่วนต่อไปนี้จะกำหนดกลไกการเข้ารหัสมาตรฐานสองแบบ คำจำกัดความของ content-transfer-encodings ใหม่ ๆ ถูกท้อแท้และควรเกิดขึ้นเฉพาะเมื่อจำเป็นอย่างยิ่ง ทั้งหมด namespace การเข้ารหัสข้อมูลการโอนย้ายยกเว้นที่เริ่มต้นด้วย X - ได้รับการสงวนไว้อย่างชัดเจนสำหรับ IANA สำหรับใช้ในอนาคต ข้อตกลงส่วนตัวเกี่ยวกับ content-transfer-encodings ยังไม่เป็นที่แน่ชัด ค่า Content-Transfer-Encoding บางอย่างสามารถใช้ได้เฉพาะกับ Content-Types เท่านั้น โดยเฉพาะอย่างยิ่งเป็นการห้ามมิให้ใช้การเข้ารหัสใด ๆ ที่ไม่ใช่ 7bit, 8bit หรือ binary กับ Content-Type ใด ๆ ที่รวมถึงฟิลด์ Content-Type แบบ recursively อื่น ๆ อย่างเช่น Multipart และ Message Content-Types การเข้ารหัสทั้งหมดที่ต้องการสำหรับเนื้อหาประเภท multipart หรือข้อความต้องทำในระดับสุดทายดวยการเขารหัสเนื้อหาจริงที่ตองการเขารหัส ข้อควรระวังในการเข้ารหัสข้อ จำกัด : แม้ว่าการห้ามใช้การเข้ารหัสข้อมูลการโอนเนื้อหาบนข้อมูลประเภท multipart หรือข้อความอาจมีความ จำกัด มากเกินไปจำเป็นต้องป้องกันการเข้ารหัสที่ซ้อนกันซึ่งข้อมูลจะถูกส่งผ่านอัลกอริทึมการเข้ารหัสหลายครั้งและต้องเป็น ถอดรหัสหลายครั้งเพื่อให้สามารถดูได้อย่างถูกต้อง การเข้ารหัสที่ซ้อนกันจะเพิ่มความซับซ้อนให้กับตัวแทนผู้ใช้: นอกจากปัญหาด้านประสิทธิภาพที่เห็นได้ชัดกับการเข้ารหัสหลายรายการแล้วยังสามารถปิดบังโครงสร้างพื้นฐานของข้อความ โดยเฉพาะอย่างยิ่งพวกเขาสามารถอนุมานได้ว่าการดำเนินการถอดรหัสหลายอย่างมีความจำเป็นเพียงเพื่อหาสิ่งที่ประเภทของวัตถุมีข้อความ การห้ามใช้การเข้ารหัสที่ซ้อนกันอาจซับซ้อนงานของเกตเวย์อีเมลบางอย่าง แต่ดูเหมือนปัญหาน้อยกว่าผลของการเข้ารหัสที่ซ้อนกันในเอเจนต์ผู้ใช้ หมายเหตุเกี่ยวกับความสัมพันธ์ระหว่างชนิดของเนื้อหาและการถ่ายโอนข้อมูลคอนเทนต์อาจดูเหมือนว่า Content-Transfer-Encoding อาจอนุมานได้จากลักษณะของ Content-Type ที่จะเข้ารหัสหรืออย่างน้อยที่สุด Content-Transfer-Encodings อาจได้รับคำสั่งให้ใช้กับ Content-Types ที่เฉพาะเจาะจง มีสาเหตุหลายประการว่าเหตุใดจึงไม่ใช่กรณีนี้ ประการแรกเนื่องจากมีประเภทการขนส่งที่แตกต่างกันสำหรับจดหมายการเข้ารหัสบางประเภทอาจเหมาะสมสำหรับการรวมเนื้อหาระหว่าง Typetransport บางอย่างและไม่ใช่สำหรับคนอื่น ๆ (ตัวอย่างเช่นในการขนส่งแบบ 8 บิตการเข้ารหัสจะไม่จำเป็นสำหรับข้อความในชุดอักขระบางตัวในขณะที่การเข้ารหัสดังกล่าวจำเป็นอย่างชัดเจนสำหรับ SMTP แบบ 7 บิต) ประการที่สองประเภทเนื้อหาบางประเภทอาจต้องการการเข้ารหัสการโอนข้อมูลแบบต่างๆภายใต้ สถานการณ์ที่แตกต่างกัน ตัวอย่างเช่นหน่วยงาน PostScript หลายแห่งอาจประกอบด้วยข้อมูลสั้น ๆ ของข้อมูล 7 บิตและด้วยเหตุนี้จึงต้องมีการเข้ารหัสเพียงเล็กน้อยหรือไม่มีเลย หน่วยงาน PostScript อื่น ๆ (โดยเฉพาะอย่างยิ่งที่ใช้กลไกการเข้ารหัสไบนารีระดับ PostScripts ระดับ 2) อาจใช้แทนไบต์ได้เฉพาะการเข้ารหัสข้อมูลการขนส่งเท่านั้น สุดท้ายเนื่องจาก Content-Type มีวัตถุประสงค์เพื่อเป็นกลไกข้อมูลจำเพาะแบบเปิดซึ่งข้อกำหนดที่เข้มงวดของความสัมพันธ์ระหว่าง Content-Types และการเข้ารหัสได้อย่างมีประสิทธิภาพสอดคล้องกับข้อกำหนดของโปรโตคอลแอพพลิเคชันโดยเฉพาะการขนส่งระดับล่าง นี่เป็นสิ่งที่ไม่พึงปรารถนาเนื่องจากนักพัฒนาซอฟต์แวร์ของ Content-Type ควรไม่ต้องตระหนักถึงการขนส่งทั้งหมดที่ใช้และข้อ จำกัด ของพวกเขา หมายเหตุเกี่ยวกับการแปลงรหัสการเข้ารหัสข้อมูลการเข้ารหัสที่อ้างถึงและการเข้ารหัส base64 ได้รับการออกแบบเพื่อให้สามารถแปลงไฟล์เหล่านี้ได้ ปัญหาเดียวที่เกิดขึ้นในการแปลงดังกล่าวคือการจัดการกับตัวแบ่งบรรทัด เมื่อแปลงจาก quoted-printable เป็น base64 บรรทัดแบ่งต้องถูกแปลงเป็นลำดับ CRLF ในทำนองเดียวกันลำดับ CRLF ในข้อมูล base64 ควรถูกแปลงเป็นช่วงบรรทัดที่พิมพ์ออกมาได้ แต่จะใช้เมื่อแปลงข้อมูลข้อความเท่านั้น หมายเหตุเกี่ยวกับรูปแบบการเข้ารหัส CANONICAL: ในร่างฉบับก่อนหน้าของบันทึกย่อนี้มีความสับสนเกี่ยวกับรูปแบบเมื่อข้อมูลอีเมลถูกแปลงเป็นรูปแบบตามรูปแบบบัญญัติและเข้ารหัสและโดยเฉพาะอย่างยิ่งว่ากระบวนการนี้จะส่งผลต่อการรักษา CRLFs อย่างไร การเป็นตัวแทนของ newlines แตกต่างกันไปอย่างมากจากระบบสู่ระบบ 5.1 การอ้างถึงเนื้อหาที่พิมพ์ได้ - การเข้ารหัส - การเข้ารหัส (Encoding-Printable) การเข้ารหัสแบบ Quoted-Printable มีวัตถุประสงค์เพื่อแสดงข้อมูลที่ประกอบด้วย octets ที่สอดคล้องกับอักขระที่พิมพ์ได้ในชุดอักขระ ASCII มัน encodes ข้อมูลในลักษณะที่ octets ผลลัพธ์ไม่น่าจะได้รับการแก้ไขโดยการขนส่งทางไปรษณีย์ หากข้อมูลที่เข้ารหัสส่วนใหญ่เป็นข้อความ ASCII รูปแบบที่เข้ารหัสของข้อมูลจะเป็นที่รู้จักโดยมนุษย์มาก เนื้อหาที่เป็น ASCII ทั้งหมดอาจมีการเข้ารหัสไว้ใน Quoted-Printable เพื่อให้มั่นใจว่าข้อมูลมีความถูกต้องครบถ้วนหากข้อความผ่านตัวอักษรแปลและ and-line wire-wire gateway ในการเข้ารหัสนี้ octets จะแสดงตามที่กำหนดโดยกฎต่อไปนี้กฎที่ 1: (การแทน 8 บิตโดยทั่วไป) อ็อพใด ๆ ยกเว้นการระบุการแบ่งบรรทัดตามการประชุมบรรทัดใหม่ของรูปแบบตามรูปแบบบัญญัติของข้อมูลที่เข้ารหัส อาจแทนด้วยตัวเลขตามด้วยการแสดงเลขฐานสิบหกหลักสองหลักของค่า octets ตัวเลขของอักขระเลขฐานสิบหกสำหรับจุดประสงค์นี้คือ 0123456789ABCDEF ต้องใช้ตัวพิมพ์ใหญ่เมื่อส่งข้อมูลเลขฐานสิบหกถึงแม้ว่าการใช้งานที่มีประสิทธิภาพอาจเลือกรับรู้ตัวอักษรตัวพิมพ์เล็กในใบเสร็จรับเงิน ดังนั้นตัวอย่างเช่นค่า 12 (รูปแบบ ASCII ฟีด) สามารถแสดงได้โดย 0C และค่า 61 (ASCII EQUAL SIGN) สามารถแสดงโดย 3D ยกเว้นเมื่อกฎต่อไปนี้อนุญาตให้มีการเข้ารหัสทางเลือกกฎนี้มีผลบังคับใช้ กฎที่ 2: (ตัวหนังสือเป็นตัวหนังสือ) Octets ที่มีค่าทศนิยมตั้งแต่ 33 ถึง 60 รวมและ 62 ถึง 126 ตัวรวมไว้อาจเป็นอักขระ ASCII ที่ตรงกับ octets เหล่านั้น (EXCLAMATION POINT น้อยกว่าและน้อยกว่า TILDE ตามลำดับ ) กฎที่ 3: (White Space) Octets ที่มีค่า 9 และ 32 อาจเป็น ASCII TAB (HT) และอักขระ SPACE ตามลำดับ แต่ต้องไม่แสดงในตอนท้ายของบรรทัดที่มีการเข้ารหัส อักขระ TAB (HT) หรือ SPACE ใด ๆ บนบรรทัดที่เข้ารหัสต้องเป็นไปตามอักขระที่พิมพ์ได้ (ดูกฎ 5) อาจเป็นไปตามอักขระ TAB (HT) หรือ SPACE อย่างน้อยหนึ่งอักขระ เป็นไปตามที่ octet ที่มีค่า 9 หรือ 32 ปรากฏขึ้นที่ส่วนท้ายของบรรทัดที่เข้ารหัสต้องเป็นไปตามกฎข้อที่ 1 กฎนี้จำเป็นเนื่องจาก MTAs (Message Transport Agents) โปรแกรมที่ส่งข้อความจากผู้ใช้คนหนึ่งไปยังอีกรายหนึ่งหรือดำเนินการ ส่วนหนึ่งของการถ่ายโอนดังกล่าว) เป็นที่รู้จักกันในการวางบรรทัดของข้อความที่มีช่องว่างและอื่น ๆ เป็นที่รู้จักในการลบอักขระพื้นที่สีขาวจากท้ายบรรทัด ดังนั้นเมื่อถอดรหัสตัวอักษร Quoted-Printable ทุกสิ่งทุกอย่างจะต้องถูกนำออกโดยตัวแทนขนส่งกลาง กฎที่ 4 (เส้นแบ่ง) การแบ่งบรรทัดในส่วนเนื้อหาข้อความโดยไม่ขึ้นกับสิ่งที่เป็นตัวแทนในการเป็นตัวแทนของข้อมูลที่ถูกเข้ารหัสจะต้องเป็นตัวแทนโดยการแบ่งบรรทัด (RFC 822) ซึ่งเป็นลำดับ CRLF ใน Quoted - การเข้ารหัสที่พิมพ์ ถ้าแยก CR และ LF หรือ LF CR และ CR LF sequences ได้รับอนุญาตให้ปรากฏในข้อมูลไบนารีตามรูปแบบตามรูปแบบบัญญัติต้องแสดงโดยใช้ 0D, 0A, 0A0D และ 0D0A ตามลำดับ โปรดทราบว่าการใช้งานจำนวนมากอาจเลือกที่จะเข้ารหัสการแสดงท้องถิ่นของเนื้อหาประเภทต่างๆได้โดยตรง โดยเฉพาะอย่างยิ่งนี้อาจใช้กับเนื้อหาข้อความล้วนในระบบที่ใช้อนุสัญญา newline นอกเหนือจากตัวคั่น CRLF การดำเนินการดังกล่าวเป็นที่ยอมรับได้ แต่การแบ่งส่วนของสายจะต้องมีการอธิบายโดยทั่วไปสำหรับกรณีที่ใช้การแทนลำดับใหม่ กฎข้อที่ 5 (เส้นแบ่งแบบอ่อน) การเข้ารหัสที่พิมพ์ด้วยตัวเลขที่อ้างถึงต้องการให้สายที่เข้ารหัสไม่เกิน 76 ตัวอักษร ถ้ามีการเข้ารหัสบรรทัดอีกต่อไปด้วยการเข้ารหัสแบบ Quoted-Printable จะต้องใช้ตัวแบ่งบรรทัดที่นุ่มนวล เครื่องหมายเท่ากับตัวสุดท้ายบนบรรทัดที่เข้ารหัสแสดงว่าบรรทัดดังกล่าวไม่เป็นสาระสำคัญ (อ่อน) ในข้อความที่เข้ารหัส ดังนั้นหากรูปแบบดิบของบรรทัดเป็นบรรทัดเดียวที่ไม่มีการเข้ารหัสที่ระบุว่า: นี่สามารถแสดงได้ใน Quoted-Printable encoding เนื่องจากนี้มีกลไกที่มีการเข้ารหัสบรรทัดยาวในลักษณะที่ผู้ใช้เรียกคืน ตัวแทน. ขีด จำกัด ของจำนวนอักขระ 76 จะไม่นับ CRLF ที่ต่อท้าย แต่จะนับอักขระอื่น ๆ ทั้งหมดรวมทั้งเครื่องหมายเท่ากันด้วย เนื่องจากอักขระยัติภังค์ (-) จะถูกแสดงเป็นตัวเองในการเข้ารหัส Quoted-Printable ต้องใช้ความระมัดระวังเมื่อ encapsulating ตัวที่เข้ารหัสที่พิมพ์ออกมาได้ในเอนทิตีแบบหลายส่วนเพื่อให้แน่ใจว่าขอบเขตการห่อหุ้มจะไม่ปรากฏที่ใดในเนื้อหาที่เข้ารหัส . (กลยุทธ์ที่ดีคือการเลือกเขตแดนที่มีลำดับตัวอักษรเช่นที่ไม่สามารถปรากฏในเนื้อหาที่พิมพ์ออกมาได้โปรดดูคำจำกัดความของข้อความแบบหลายส่วนในเอกสารนี้) หมายเหตุ: การเข้ารหัสที่อ้างถึงเป็นสิ่งที่หมายถึง ประนีประนอมระหว่างการอ่านและความน่าเชื่อถือในการขนส่ง ตัวที่เข้ารหัสด้วยการเข้ารหัสที่พิมพ์ได้จะทำงานได้อย่างน่าเชื่อถือมากกว่าเกตเวย์เมลส่วนใหญ่ แต่อาจทำงานได้ไม่ดีในเกตเวย์บางส่วนโดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับการแปลเป็น EBCDIC (ในทางทฤษฎีเกตเวย์ EBCDIC สามารถถอดรหัสตัวพิมพ์ที่พิมพ์ออกมาได้และเข้ารหัสใหม่โดยใช้ base64 แต่เกตเวย์ดังกล่าวยังไม่มีอยู่) ระดับความเชื่อมั่นที่สูงขึ้นคือ base64 Content-Transfer-Encoding วิธีการขนส่งที่น่าเชื่อถืออย่างเหมาะสมผ่านเกตเวย์ EBCDIC ก็คือการอ้างอิงอักขระ ASCII ตามกฎ 1 ดูภาคผนวก B สำหรับข้อมูลเพิ่มเติม เนื่องจากข้อมูลที่ยกมาพิมพ์โดยทั่วไปจะสันนิษฐานว่าเป็นเส้นเชิงเส้นคาดว่าการแบ่งระหว่างบรรทัดของข้อมูลที่พิมพ์ที่ยกมาอาจมีการเปลี่ยนแปลงในการขนส่งในลักษณะเดียวกับที่ข้อความธรรมดาได้รับการแก้ไขเสมอในจดหมายทางอินเทอร์เน็ต เมื่อผ่านระหว่างระบบที่มีอนุสัญญาใหม่ที่แตกต่างกัน หากการเปลี่ยนแปลงดังกล่าวมีแนวโน้มที่จะก่อให้เกิดความเสียหายของข้อมูลอาจเป็นเหตุผลมากกว่าที่จะใช้การเข้ารหัส base64 มากกว่าการเข้ารหัสที่อ้างถึง 5.2 การเข้ารหัส - การเข้ารหัสเนื้อหาของ Base64 การเข้ารหัส - การเข้ารหัส - Base64 ได้รับการออกแบบมาเพื่อเป็นตัวแทนของลำดับชั้นของอะตอมตามรูปแบบที่ไม่สามารถอ่านได้ อัลกอริทึมการเข้ารหัสและถอดรหัสทำได้ง่าย แต่ข้อมูลที่เข้ารหัสจะมีขนาดใหญ่กว่าข้อมูลที่ไม่ได้เข้ารหัสเพียง 33 เปอร์เซ็นต์เท่านั้น การเข้ารหัสนี้ขึ้นอยู่กับรูปแบบที่ใช้ในแอพพลิเคชันจดหมายส่วนตัวของความเป็นส่วนตัวตามที่กำหนดไว้ใน RFC 1113 การเข้ารหัสฐานข้อมูลถูกปรับให้เข้ากับ RFC 1113 โดยมีการเปลี่ยนแปลง: base64 ช่วยลดกลไกการฝังตัวข้อความที่ชัดเจน ใช้ชุดย่อย 65 ตัวของ US-ASCII ทำให้สามารถพิมพ์ได้ 6 บิตต่ออักขระที่สามารถพิมพ์ได้ (อักขระพิเศษ 65th ถูกใช้เพื่อระบุฟังก์ชันการประมวลผลพิเศษ) หมายเหตุ: เซ็ตย่อยนี้มีคุณสมบัติที่สำคัญที่แสดงในเวอร์ชัน ISO 646 ทุกฉบับรวมทั้ง US ASCII และอักขระทั้งหมดในเซตย่อยจะแสดงด้วย เหมือนกันในทุกเวอร์ชันของ EBCDIC การเข้ารหัสที่เป็นที่นิยมอื่น ๆ เช่นการเข้ารหัสที่ใช้โดยยูทิลิตี UUENCODE และการเข้ารหัสฐาน base85 ที่ระบุเป็นส่วนหนึ่งของ PostScript ระดับ 2 ไม่ใช้คุณสมบัติเหล่านี้ร่วมกันดังนั้นจึงไม่สามารถตอบสนองความต้องการในการพกพาได้ต้องมีการเข้ารหัสไบนารีสำหรับการรับส่งจดหมาย กระบวนการเข้ารหัสหมายถึงกลุ่มบิตอินพุต 24 บิตเป็นสตริงเอาต์พุตของอักขระที่เข้ารหัส 4 ตัว การดำเนินการจากซ้ายไปขวากลุ่มอินพุต 24 บิตจะถูกสร้างขึ้นโดยการรวมกลุ่มอินพุท 8 บิตไว้ด้วยกัน บิต 24 บิตเหล่านี้จะถูกถือว่าเป็น 4 กลุ่มที่แบ่งเป็นกลุ่ม 6 บิตซึ่งแต่ละส่วนจะถูกแปลเป็นตัวเลขเดียวในตัวอักษร base64 เมื่อเข้ารหัสบิตสตรีมผ่านการเข้ารหัส base64 จะต้องมีการสั่งให้บิตสตรีมถูกสั่งให้ทำกับบิตที่มีนัยสำคัญที่สุดก่อน นั่นคือบิตแรกในสตรีมจะเป็นบิตลำดับสูงในไบต์แรกและบิตที่แปดจะเป็นบิตต่ำสุดในไบต์แรกและอื่น ๆ แต่ละกลุ่ม 6 บิตถูกใช้เป็นดัชนีในอาร์เรย์ของ 64 ตัวอักษรที่สามารถพิมพ์ได้ อักขระที่อ้างอิงโดยดัชนีถูกวางไว้ในสตริงเอาต์พุต ตัวอักษรเหล่านี้ระบุไว้ในตารางที่ 1 ด้านล่างได้รับการคัดเลือกเพื่อให้สามารถแสดงได้อย่างกว้างขวางและชุดนี้ไม่รวมอักขระที่มีความสำคัญเป็นพิเศษกับ SMTP (เช่น CR, LF) และขอบเขตการห่อหุ้มที่กำหนดไว้ในเอกสารนี้ (เช่น -) . ตารางที่ 1: ตัวอักษร Base64 สตรีมข้อมูลขาออก (ไบต์ที่เข้ารหัส) ต้องอยู่ในบรรทัดที่มีความยาวไม่เกิน 76 อักขระ ตัวถอดรหัสทั้งหมดหรืออักขระอื่น ๆ ที่ไม่พบในตารางที่ 1 ต้องถูกละเว้นโดยการถอดรหัสซอฟต์แวร์ ในข้อมูล base64 อักขระอื่น ๆ นอกเหนือจากที่ระบุในตารางที่ 1 ตัวแบ่งบรรทัดและพื้นที่สีขาวอื่น ๆ อาจบ่งบอกถึงข้อผิดพลาดในการส่งข้อมูลซึ่งข้อความเตือนหรือแม้แต่การปฏิเสธข้อความอาจเหมาะสมในบางกรณี การประมวลผลพิเศษจะดำเนินการหากมีการเข้ารหัสน้อยกว่า 24 บิตในตอนท้ายของข้อมูลที่เข้ารหัส ควอนตัมการเข้ารหัสเต็มรูปแบบจะเสร็จสมบูรณ์เมื่อสิ้นสุดร่างกาย เมื่อบิตป้อนข้อมูลน้อยกว่า 24 รายการมีอยู่ในกลุ่มอินพุตจะมีการเพิ่มศูนย์บิต (ทางด้านขวา) เพื่อสร้างกลุ่มย่อยจำนวน 6 บิต ตำแหน่งตัวอักษรเอาต์พุตซึ่งไม่จำเป็นต้องแสดงข้อมูลอินพุตที่แท้จริงจะถูกตั้งค่าเป็นอักขระ เนื่องจากการป้อนข้อมูล base64 ทั้งหมดเป็นจำนวนเต็มของ octets จะมีเพียงกรณีต่อไปนี้เท่านั้นที่สามารถเกิดขึ้นได้ (1) จำนวนควอนตัมสุดท้ายของการป้อนข้อมูลการเข้ารหัสเป็นจำนวนหลายส่วนของ 24 บิตที่นี่หน่วยสุดท้ายของการเข้ารหัสจะเป็นจำนวนรวม 4 ตัว (2) ควอนตัมควอนตัมสุดท้ายของการป้อนข้อมูลการเข้ารหัสคือตรง 8 บิตที่นี่หน่วยสุดท้ายของการเข้ารหัสจะมีสองตัวอักษรตามด้วยสองตัว padding หรือ (3) ควอนตัมสุดท้ายของการป้อนข้อมูลการเข้ารหัสคือตรง 16 บิตที่นี่ หน่วยสุดท้ายของการเข้ารหัสจะมีอักขระสามตัวตามด้วยอักขระ padding หนึ่งตัว ต้องใช้ความระมัดระวังในการแบ่งบรรทัดหากต้องการใช้การเข้ารหัส base64 โดยตรงกับเนื้อหาข้อความที่ไม่ได้แปลงเป็นรูปแบบตามรูปแบบบัญญัติ โดยเฉพาะอย่างยิ่งการแบ่งบรรทัดข้อความควรเปลี่ยนเป็นลำดับ CRLF ก่อนการเข้ารหัส base64 สิ่งสำคัญที่ควรทราบก็คือการทำเช่นนี้อาจทำได้โดยตรงโดยตัวเข้ารหัสมากกว่าในขั้นตอนการปรับรูปแบบการยอมรับก่อนในการใช้งานบางอย่าง หมายเหตุ: ไม่จำเป็นต้องกังวลเกี่ยวกับการอ้างขอบเขตการ encapsulation ที่เห็นได้ชัดภายในส่วนที่เข้ารหัสด้วย base64 ของเอนทิตีแบบหลายส่วนเนื่องจากไม่มีการใช้อักขระยัติภังค์ในการเข้ารหัส base64 การเข้ารหัส - การเข้ารหัส: 8 บิตเพิ่มอย่างไม่ถูกต้องไปยังส่วนหัวของอีเมลหลายรายการด้วยรูปภาพแบบอินไลน์ การตอบกลับข้อความ HTML ไปยังรายการข้อความที่ยกมาเดิมจะแสดงผลเป็นทั้งเวอร์ชันข้อความธรรมดาที่ถูกต้องของข้อความตามด้วยการแสดงผลข้อความธรรมดาของซอร์สโค้ด HTML ของข้อความ HTML เวอร์ชันและการเข้ารหัสแบบข้อความธรรมดาของ base64 ของภาพแบบอินไลน์ ลักษณะการทำงานนี้ได้รับการบันทึกไว้ในข้อความที่ส่งมาจาก Postbox 3.05 สำหรับ Mac OS X โดยมีภาพอินไลน์เป็นภาพโปรไฟล์ของผู้ส่งจากสมุดที่อยู่และข้อความ HTML ที่มีการจัดรูปแบบพื้นฐานเป็นอย่างอื่น หากต้องการรับการยืนยันหากตรงกับโปรแกรมอีเมลนี้ การจัดตำแหน่งเครดิต: babbage แสดงความคิดเห็น 8 กันยายน 2012 เวลา 9:40 น. ข้อความ HTML ที่ได้รับการแสดงผลเป็นบรรทัดในเป็นรูปแบบข้อความธรรมดาของโค้ดรูปภาพแบบอินไลน์ถูกแสดงผลเป็นเวอร์ชันของข้อความล้วนๆยืนยันว่าปัญหานี้ไม่เกิดขึ้นถ้าฉันปิดการกำหนดค่า Postbox รวมรูปภาพที่ติดต่อสำหรับผู้เข้าร่วมแต่ละรายเมื่อสรุปซึ่งนำไปสู่ส่วนหนึ่งในอีเมลแบบ HTML multipart ของ imagejpeg: ดังนั้นปัญหานี้อาจถูก จำกัด ไว้เมื่อรูปภาพแบบบรรทัดถูกรวมอยู่ในข้อความกลุ่ม babbage การระบุแหล่งที่มาเครดิต: babbage แสดงความคิดเห็น 8 กันยายน 2012 เวลา 09:51 น. ยืนยันว่าไม่มีปัญหาในการส่งข้อความไปยังรายการที่มีไฟล์ jpg มาตรฐานเป็นไฟล์แนบไม่ใช่แบบอินไลน์ ยืนยันข้อความแบบอินไลน์ในข้อความต้นฉบับส่งผลให้ไฟล์ HTML และ imagejpeg ถูกแสดงผลเป็นข้อความล้วนในข้อความที่ส่งออกดังนั้นจึงไม่ จำกัด เฉพาะการตอบกลับของข้อความ babbage เครดิตการระบุแหล่งที่มา: babbage แสดงความคิดเห็น 8 กันยายน 2012 เวลา 09:59 น. ปัญหาเกิดขึ้นกับส่วนของ ogmailinglisttransport. inc ใน c. บรรทัด 908 (หมายเลขบรรทัดอาจมีการเปลี่ยนแปลงเนื่องจากการทำงานของฉันในไฟล์) ในส่วนที่เริ่มต้น: นี่คือส่วนของรหัสที่ดูเหมือนจะก่อให้เกิดปัญหานี้ อีเมลที่มีรูปแบบอินไลน์มีส่วนหัวเช่น: Content-Type: ขอบเขต multipartmixedDrupal-OG-Mailinglist - 1143534839 charsetUTF-8 อีเมลที่ไม่มีปัญหาไม่มีขอบเขต Drupal-OG-Mailinglist - 1143534839 และมีสิ่งที่ต้องการเช่น Content-Type: multipartmixed ขอบเขตแน่นอน ------------ 050107000403000604050201 charsetUTF-8 แน่นอนว่าธรรมชาติของขอบเขตมีแนวโน้มที่จะค่อนข้างส่งอีเมลไคลเอ็นต์เฉพาะ แต่ดูเหมือนว่าจะแคบลงไปถึงปัญหาในการสร้าง ของ MIME ใหม่ตามที่ระบุข้างต้น babbage การระบุแหล่งที่มาเครดิต: babbage แสดงความคิดเห็น 8 กันยายน 2012 เวลา 10:19 น. อืม อีเมลที่มีปัญหานี้มีโครงสร้างส่วนหัวต่อไปนี้นั่นคือส่วนหัวหลักระบุว่า Content-Transfer-Encoding คือ 8 บิต (และ UTF-8) แต่ทุกรัฐย่อยก็คือ 7bit (และ ISO-8859-1 ใน กรณีของข้อความเหล่านี้) ฉันคิดความแตกต่าง 8bit7bit อาจเป็นปัญหาที่นี่ babbage Credit Attribution: babbage commented 8 กันยายน 2012 เวลา 21:10 ถ้าฟิลด์ส่วนหัว Content-Transfer-Encoding ปรากฏเป็นส่วนหนึ่งของส่วนหัวของข้อความจะใช้กับเนื้อหาทั้งหมดของข้อความนั้น . หากฟิลด์ส่วนหัว Content-Transfer-Encoding ปรากฏเป็นส่วนหัวของส่วนหัวของร่างกายจะใช้เฉพาะกับส่วนของร่างกายเท่านั้น หากเอนทิตีเป็นประเภท multipart หรือข้อความ Content-Transfer-Encoding ไม่ได้รับอนุญาตให้มีค่าอื่นนอกเหนือจากความกว้างบิต (เช่น 7bit, 8bit ฯลฯ ) หรือไบนารี ดังนั้นการแสดงสเปค 8 บิตที่ชัดเจนในส่วนหัวจะแทนที่ข้อกำหนด 7 บิตในข้อความแบบหลายส่วน แม้ว่าการไม่มี Content-Transfer-Encoding ใด ๆ ในส่วนหัวจะหลีกเลี่ยงปัญหานี้ได้เนื่องจากทั้งสองข้อกำหนดนี้จะใช้ แต่เนื่องจากเอกสารเดียวกันระบุ 7bit เป็นค่าดีฟอลต์หากไม่ได้ระบุการเข้ารหัสไว้

No comments:

Post a Comment