แปลก \ n ในสตริงที่เข้ารหัส base64 ใน Ruby


159

ไลบรารี Base64 inbuilt ใน Ruby กำลังเพิ่ม '\ n's บางอย่าง ฉันไม่สามารถหาเหตุผลได้ สำหรับตัวอย่างพิเศษนี้:

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'base64'
=> true
irb(main):003:0> str =  "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
=> "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
irb(main):004:0> Base64.encode64(str)
=> "MTExMC0tYWQ2Y2EwYjA2ZTFmYmViN2U2NTE4YTA0MThhNzNhNmUwNGE2NzA1\nNA==\n"

\ n อยู่ที่ตำแหน่งสุดท้ายและอันดับที่ 6 จากจุดสิ้นสุด ตัวถอดรหัส (Base64.decode64) จะส่งคืนสตริงเก่าอย่างสมบูรณ์แบบ สิ่งที่แปลกคือ \ n เหล่านี้ไม่ได้เพิ่มค่าใด ๆ กับสตริงที่เข้ารหัส เมื่อฉันลบบรรทัดใหม่ออกจากสายอักขระตัวถอดรหัสถอดรหัสมันอีกครั้งอย่างสมบูรณ์แบบ

irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true

ยิ่งไปกว่านั้นฉันใช้ไลบรารี JS อื่นเพื่อสร้างเอาต์พุตที่เข้ารหัส base64 ของสตริงอินพุตเดียวกันผลลัพธ์จะมาโดยไม่มี \ n

นี่เป็นข้อบกพร่องหรืออย่างอื่นหรือไม่? มีใครเคยประสบปัญหานี้มาก่อนหรือไม่

FYI,

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

ปัญหาประหลาดเหมือนกันที่นี่
Nadav B

คำตอบ:


223

แก้ไข:เนื่องจากฉันเขียนคำตอบนี้Base64.strict_encode64()ถูกเพิ่มซึ่งไม่ได้เพิ่มบรรทัดใหม่


เอกสารค่อนข้างสับสนb64encodeวิธีที่ควรเพิ่มบรรทัดใหม่สำหรับอักขระทุกตัวที่อายุ 60 ปีและตัวอย่างสำหรับencode64วิธีการนี้ใช้b64encodeวิธีการจริง

ดูเหมือนว่าpack("m")วิธีการสำหรับคลาส Array ที่ใช้โดยencode64เพิ่มบรรทัดใหม่ ฉันจะพิจารณาว่าเป็นข้อบกพร่องในการออกแบบซึ่งไม่ใช่ตัวเลือก

คุณสามารถลบบรรทัดใหม่ด้วยตัวคุณเองหรือถ้าคุณกำลังใช้ Rails มีActiveSupport :: CoreExtensions :: Base64 :: การเข้ารหัสด้วยencode64sวิธีการ


44
ดูเหมือนว่าตั้งแต่ฉันเขียนคำตอบนี้มีตอนนี้strict_encode64()ที่เห็นได้ชัดไม่เพิ่มบรรทัดใหม่
Christoffer Hammarström

15
โง่มาก! ทำไมคุณถึงทำอย่างนี้กับฉันทับทิม?
Josh M.

1
นี่เป็นค่าเริ่มต้นของ assinie แต่ @ @ ChristofferHammarströmกล่าวถึงมีวิธีที่จะได้รับการเข้ารหัส b64 จริงในขณะนี้
ด่าน

1
เห็นได้ชัดว่ามีอยู่เพื่อรักษาความเข้ากันได้ย้อนหลังกับซอฟต์แวร์ที่ไม่สามารถจัดการสายยาว stackoverflow.com/a/20065991/5749914
Chimpanzee Warlike

115

ใน ruby-1.9.2 คุณมี Base64.strict_encode64 ซึ่งไม่ได้เพิ่ม \ n (ขึ้นบรรทัดใหม่) ในตอนท้าย


นั่นเป็นวิธีที่ง่ายกว่ามาก!
Avishai

ฉันได้ตรวจสอบ Base64.strict_encode64 ว่าเข้ารหัสสตริงอักขระสามตัวไม่ถูกต้อง ชอบ Base64.strict_encode64 ('abc') -> YWJj ตัวอย่างข้างต้นไม่ได้เข้ารหัสอย่างถูกต้อง
CodeMaker

9

ใช่นี่เป็นเรื่องปกติ docให้ตัวอย่างแสดงให้เห็นถึงสายแยก base64 ทำสิ่งเดียวกันในภาษาอื่นเช่นกัน (เช่น Python)

เหตุผลการขึ้นบรรทัดใหม่ที่ไม่มีเนื้อหาถูกเพิ่มเข้ามาในขั้นตอนการเข้ารหัสเนื่องจากเดิมฐานประดิษฐ์ 64 ได้ถูกคิดค้นเป็นกลไกการเข้ารหัสสำหรับการส่งเนื้อหาไบนารีในอีเมลโดยที่ความยาวบรรทัดถูก จำกัด อย่าลังเลที่จะเปลี่ยนมันหากคุณไม่ต้องการ


1
สิ่งนี้เพิ่งเกิดขึ้นใน Android App ของฉัน (ไลบรารี Base64 ของ Java) ฉันสับสนโดยสิ้นเชิงกับการเกิดขึ้นที่แปลกประหลาดนี้ เอาตัวฉันไป 1 ชั่วโมงเพื่อหาว่ามีอะไรผิดปกติจากนั้นจึงค้นหาข้อผิดพลาด ความคิดเห็นนี้ช่วยให้เข้าใจปัญหาดั้งเดิมได้แม้หลังจาก 6 ปี
burglarhobbit

5

ดูเหมือนว่าพวกเขาจะต้องถูกถอด / เพิกเฉยเช่น:

Base64.encode64(str).gsub(/\n/, '')

ทางออกนี้สกปรก .. มีอีกไหม?
Arnold Roa

1
@ Yaauie ( ผ่านการแก้ไขที่แนะนำ ): การแก้ไขที่ทำให้เกิดการเปลี่ยนแปลงอย่างมีนัยสำคัญโดยทั่วไปไม่ควรทำ ฉันขอแนะนำให้โพสต์ว่าเป็นคำตอบที่แยกต่างหาก
Pokechu22


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.