เหตุใดจึงไม่ใช้ base128 [ปิด]


90

เหตุใดจึงใช้เฉพาะ base64 แทนที่จะเป็น base128 ในการส่งข้อมูลไบนารีบนเว็บ ชุดอักขระ ASCII มีอักขระ 128 ตัวซึ่งในทางทฤษฎีสามารถแสดงถึงฐาน 128 แต่ส่วนใหญ่จะใช้เฉพาะ base64 แต่ไม่ได้ใช้ base128


60
ทำไมไม่ถึงฐาน 256?
Gumbo

22
ฉันคิดว่าประเด็นคือการมีตัวอักษรที่พิมพ์ได้(แม้ว่าจะมีมากกว่า 64 ... )
Felix Kling

29
ฉันคิดว่าฐาน 128 เป็นของเราเมื่อสักครู่แล้ว ทีมที่ได้รับมอบหมายให้เฝ้าฐาน 64 ยังคงยึดมั่น
Ritch Melton

5
เหตุใดคำถามนี้จึงเจาะจงจาวาสคริปต์ สิ่งนี้ถือเป็นจริงสำหรับภาษาอื่น ๆ ส่วนใหญ่ที่ใช้ในเว็บด้วยใช่หรือไม่?
Benedikt Waldvogel

5
@KenRockot: ฉันเห็นว่าคุณรับรู้ว่าอักขระ 15 บิตบางตัวของคุณจะถูกเข้ารหัสเป็น 3 ไบต์ การเข้ารหัสฐาน -2048 ของคุณหมายถึงการบรรจุ 11 บิตเป็น 2 ไบต์ซึ่งทำให้ 5.5 บิตต่อไบต์ - น้อยกว่าฐาน -64 ครึ่งบิต
maaartinus

คำตอบ:


105

ปัญหาคืออย่างน้อย 32 อักขระของชุดอักขระ ASCII เป็น 'อักขระควบคุม' ซึ่งอาจถูกตีความโดยเทอร์มินัลรับ เช่นมีอักขระ BEL (กระดิ่ง) ที่ทำให้เทอร์มินัลกระดิ่งรับ มีตัวอักษร SOT (Start Of Transmission) และ EOT (End Of Transmission) ซึ่งแสดงถึงชื่อของพวกเขา และอย่าลืมอักขระ CR และ LF ซึ่งอาจมีความหมายพิเศษในการทำให้โครงสร้างข้อมูลต่อเนื่อง / แบนลงในสตรีม

Adobe สร้างการเข้ารหัส Base85เพื่อใช้อักขระเพิ่มเติมในชุดอักขระ ASCII แต่ AFAIK ได้รับการคุ้มครองโดยสิทธิบัตร


7
Base91 ดูเหมือนจะเป็นตัวเลือกโอเพ่นซอร์สที่ดี: base91.sourceforge.net
Jorge Cevallos

2
ควรพิจารณาว่ากำลังของ 2 ไบต์จะพอดีกับข้อมูลมากกว่าและการเข้ารหัสนั้นง่ายกว่า จากนั้นก็มีการพกพา ทุกภาษามีการเข้ารหัส base64 และ / หรือถอดรหัส base64
Lodewijk

5
Re Base85 และ Adobe : คำตอบอาจมีประโยชน์มากขึ้นหากอ้างถึงหมายเลขสิทธิบัตรและปีที่ได้รับ หากสิทธิบัตรเป็นปัญหามีอยู่เสมอbtoaซึ่งนับตั้งแต่ปี 1990 ไม่มีภาระผูกพันตามสิทธิบัตรและสิทธิบัตรเหล่านั้นก็จะหมดอายุลงอย่างแน่นอน
agc

65

เนื่องจากอักขระ 128 ตัวบางตัวไม่สามารถพิมพ์ได้ (ส่วนใหญ่เป็นอักขระที่ต่ำกว่าจุดรหัส 0x20) ดังนั้นจึงไม่สามารถส่งเป็นสตริงผ่านสายได้อย่างน่าเชื่อถือ และถ้าคุณอยู่เหนือ codepoint 128 คุณอาจมีปัญหาในการเข้ารหัสเนื่องจากการเข้ารหัสที่แตกต่างกันที่ใช้ในระบบต่างๆ


8
Base94 มีอยู่ที่นี่ใน github โดยใช้อักขระ ASCII ทั้งหมด 94 ตัวที่พิมพ์ได้: gist.github.com/iso2022jp/4054241
intrepidis

15

ตามที่ระบุไว้แล้วในคำตอบอื่นประเด็นสำคัญคือการลดชุดอักขระให้เป็นแบบที่สามารถพิมพ์ได้ รูปแบบการเข้ารหัสที่มีประสิทธิภาพมากขึ้นคือbasE91เนื่องจากใช้ชุดอักขระที่ใหญ่กว่าและยังคงหลีกเลี่ยงอักขระควบคุม / เว้นวรรคในช่วง ASCII ที่ต่ำ หน้าเว็บมีการเปรียบเทียบประสิทธิภาพการเข้ารหัสแบบไบนารีกับ base64 เทียบกับbasE91

ฉันเคยล้างการใช้งาน Java หากผู้คนสนใจฉันสามารถส่งมันไปที่ GitHub

อัพเดท : ก็ตอนนี้บน GitHub


ฉันสนใจเวอร์ชัน java
Michael Deardeuff

2
ส่งไปที่: github.com/bwaldvogel/base91
Benedikt Waldvogel

12

อักขระ 32 ตัวแรกเป็นอักขระควบคุมไม่มีความเกี่ยวข้องอย่างแน่นอนเพราะคุณไม่จำเป็นต้องใช้อักขระเหล่านี้เพื่อรับอักขระ 128 ตัว เรามีอักขระ 256 ตัวให้เลือกและมีเพียง 32 ตัวแรกเท่านั้นที่เป็นอักขระควบคุม ซึ่งทำให้เหลือ 192 อักขระดังนั้น 128 จึงเป็นไปได้อย่างสมบูรณ์โดยไม่ต้องใช้อักขระควบคุม

นี่คือเหตุผล: ต้องมีบางอย่างที่มีลักษณะเหมือนกันและคุณสามารถคัดลอกและวางได้ไม่ว่าจะอยู่ที่ไหน ดังนั้นจึงต้องเป็นอักขระที่จะแสดงเหมือนกันในฟอรัมแชทอีเมลและอื่น ๆ นั่นหมายความว่าเราไม่สามารถใช้อักขระซึ่งโดยทั่วไปแล้วฟอรัม / แชท / ไคลเอนต์อีเมลอาจใช้ในการจัดรูปแบบหรือเพิกเฉย นอกจากนี้ยังต้องเป็นอักขระที่เหมือนกันโดยไม่คำนึงถึงการตั้งค่าแบบอักษรภาษาและภูมิภาค

นั่นคือเหตุผล!


7
อักขระควบคุมมีความเกี่ยวข้องเพราะทุกคนค่อนข้างสันนิษฐานจุดของคุณอยู่แล้วว่าควรเป็นหน้ารหัส / การเข้ารหัสที่เป็นกลางที่สุด จำเป็นต้อง จำกัด ให้คุณอยู่เฉพาะ ASCII (7 บิต) ซึ่งเป็นส่วนย่อยของการเข้ารหัสที่เกี่ยวข้องส่วนใหญ่ นอกจากนี้อินเทอร์เน็ตทั้งหมดยังไม่สะอาดแบบ 8 บิตและส่วนใหญ่เป็น ASCII ที่ผิดปกติ ประเด็นของคุณควรค่าแก่การทำ
Tim Seguine

7
เพื่อเพิ่ม: ASCII กำหนดอักขระ 128 ตัวเท่านั้น อักขระ # 128 ถึง # 255 ไม่ได้กำหนดไว้ใน ASCII เนื่องจากคำถามกล่าวถึง ASCII อย่างชัดเจนไม่ใช่ "การเข้ารหัส 8 บิตใด ๆ " คำตอบทั้งหมดจึง จำกัด อักขระ 128 ตัวของชุด ASCII
pepoluan

การใช้การเข้ารหัส UTF-8 ที่พบบ่อยที่สุดเป็นตัวอย่าง: ไบต์ที่ 128 ถึง 196 จะทำให้เกิดข้อผิดพลาดในการถอดรหัส UTF8 ทันที ไบต์ที่ 196 ถึง 256 หมายความว่าไบต์ถัดไปเป็นอักขระเดียวกัน แต่ถ้าไบต์ถัดไปมีค่าต่ำกว่า 128 จะทำให้เกิดข้อผิดพลาดในการถอดรหัส UTF8 อีกครั้ง อย่างไรก็ตามภาษาที่ไวต่อการเข้ารหัสอักขระเกือบทั้งหมดจะมีไลบรารี base64 ใช้สตริง base64 เป็นสตริง UTF8-safe ไม่สามารถทำได้เช่นเดียวกันกับ base128 เนื่องจากไม่สามารถเข้ารหัสเป็นสตริง UTF8-safe
SOFe

10

Base64 เป็นเรื่องปกติเพราะสามารถแก้ปัญหาได้หลากหลาย (ทำงานได้เกือบทุกที่ที่คุณนึกออก)

  • คุณไม่จำเป็นต้องกังวลว่าการขนส่งจะสะอาดแบบ 8 บิตหรือไม่

  • สามารถพิมพ์อักขระทั้งหมดในการเข้ารหัสได้ คุณสามารถดูได้ คุณสามารถคัดลอกและวางได้ คุณสามารถใช้ใน URL (ตัวแปรเฉพาะ) เป็นต้น

  • ขนาดการเข้ารหัสคงที่ คุณทราบดีว่าmไบต์สามารถเข้ารหัสเป็นnไบต์ได้เสมอ

  • ทุกคนเคยได้ยินเรื่องนี้ - ได้รับการสนับสนุนอย่างกว้างขวางมีห้องสมุดจำนวนมากจึงทำงานร่วมกันได้ง่าย

Base128 ไม่มีข้อดีทั้งหมด

ดูเหมือนว่าจะสะอาด 8 บิต - แต่จำได้ว่า base64 ใช้ 65 สัญลักษณ์ หากไม่มีอักขระนอกแบนด์คุณจะไม่สามารถใช้ประโยชน์จากขนาดการเข้ารหัสที่คงที่ได้ หากคุณใช้ตัวละครนอกวงคุณจะไม่สามารถทำความสะอาดแบบ 8 บิตได้อีกต่อไป

ไม่ใช่เชิงลบทั้งหมด

  • base128 เข้ารหัส / ถอดรหัสได้ง่ายกว่า base64 - คุณแค่ใช้กะและมาสก์ อาจมีความสำคัญสำหรับการใช้งานแบบฝัง

  • base128 ใช้การขนส่งอย่างมีประสิทธิภาพมากกว่า base64 เล็กน้อยโดยใช้บิตที่มีให้มากขึ้น

คนทำใช้ base128 - ฉันใช้มันสำหรับบางสิ่งบางอย่างในขณะนี้ มันไม่ธรรมดาเหมือนกัน


โปรดจำไว้ว่าระบบอีเมล / ข่าวสารและ ilk ของพวกเขา (รวมถึง XML) นั้นไม่ได้เหมาะกับ 32 codepoints แรกเสมอไป (เช่น CR LF กับ LF เป็นต้น) แต่อย่างอื่นคำตอบของคุณก็ดูดีมาก
SamB

"ที่ base64 ใช้ 65 สัญลักษณ์" => พิมพ์ผิดหรือฉันพลาดอะไรไป?
Kikiwa

@Kikiwa, ดูที่นี้ตัวอย่าง Java บนวิกิพีเดีย ตรวจสอบความยาวของCODESตัวแปร
John La Rooy

โอ้ใช่อักขระช่องว่างภายใน '=' ที่ส่วนท้ายของเพย์โหลดการเข้ารหัสเท่านั้นใช่แล้วขอบคุณ
Kikiwa

4

ไม่แน่ใจ แต่ฉันคิดว่าค่าที่ต่ำกว่า (แสดงรหัสควบคุมหรืออะไรบางอย่าง) ไม่ได้ถูกถ่ายโอนอย่างน่าเชื่อถือเป็นข้อความ / อักขระภายในคำขอ / การตอบกลับ HTTP และค่าที่สูงกว่า 127 อาจเป็น locale / codepage / อะไรก็ตามที่ระบุดังนั้นจึงไม่มี 128 อักขระที่แตกต่างกันซึ่งคาดว่าจะใช้งานได้กับทุกเบราว์เซอร์ / แพลตฟอร์ม



2

ชำระเงิน base128 PHP-Class การเข้ารหัสและถอดรหัสด้วยชุดอักขระ ISO 8859-1

GoogleCode PHP-Class Base128


1
ฉันหวังว่ามันจะใช้ utf-8 แทน ...
Janus Troelsen

1
การเข้ารหัสฐานไม่มีส่วนเกี่ยวข้องกับข้อมูลพื้นฐาน คุณสามารถใช้การเข้ารหัสข้อความใดก็ได้ที่คุณต้องการเข้ารหัสข้อความ / ข้อมูลของคุณ สิ่งที่เขาหมายถึงคือตารางดัชนีฐาน ## ใช้ชุดอักขระ ISO 8859-1 ASCII เป็นตัวแปล
ชาด

1
มีบางอย่างเกี่ยวข้องกับข้อมูลพื้นฐานทันทีที่คุณพยายามฝังข้อมูลไบนารีฐานที่เข้ารหัสในข้อความ หากข้อความนั้นถูกเข้ารหัสด้วยการเข้ารหัสอื่นคุณจะมีปัญหา
Stijn de Witt

ไม่มีสิ่งที่เรียกว่าชุดอักขระ "ISO 8859-1 ASCII" โปรแกรมเข้ารหัสข้อมูลโดยใช้อักขระ ISO 8859-1 ที่พิมพ์ได้ 128 ตัว ไม่ใช้ ASCII ไม่ว่าจะด้วยวิธีใดรูปร่างหรือรูปแบบ
Nisse Engström
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.