Ruby의 base64 인코딩 문자열에서 이상한 \ n


159

Ruby에 내장 된 Base64 라이브러리에 '\ n'이 추가되었습니다. 이유를 찾을 수 없습니다. 이 특별한 예를 들어 :

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이 없습니다.

이것은 버그입니까 아니면 다른 것입니까? 전에이 문제에 직면 한 사람이 있습니까?

참고로,

$ 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도 줄 바꿈을 추가하는 것 같습니다 . 이것이 선택 사항이 아닌 디자인 버그라고 생각합니다.

줄 바꿈을 직접 제거하거나 레일을 사용 하는 경우 메소드를 사용하여 ActiveSupport :: CoreExtensions :: Base64 :: Encodingencode64s있습니다.


44
내가이 대답을 쓴 이후로 줄 strict_encode64()바꿈을 추가하지 않는 것이 이제 있습니다.
Christoffer Hammarström

15
너무 바보! 루비?
Josh M.

1
이것은 기본 설정이지만 @ ChristofferHammarström이 언급했듯이 이제 진정한 b64 인코딩을 얻는 방법이 있습니다.
Dan

1
분명히 이것은 긴 줄을 처리 할 수없는 소프트웨어와의 호환성을 유지하기 위해 존재합니다. stackoverflow.com/a/20065991/5749914
Warlike Chimpanzee

115

루비 -1.9.2에는 끝에 \ n (줄 바꿈)을 추가하지 않는 Base64.strict_encode64가 있습니다.


훨씬 쉬운 솔루션입니다!
Avishai

Base64.strict_encode64가 3 문자열로 올바르게 인코딩되지 않았는지 확인했습니다. Base64.strict_encode64 ( 'abc')-> YWJj와 같이. 위의 예는 올바르게 인코딩되지 않았습니다.
CodeMaker

9

예, 이것은 정상입니다. 이 문서 는 라인 분할을 보여주는 예제를 제공합니다. base64는 다른 언어에서도 마찬가지입니다 (예 : Python).

내용없는 줄 바꿈이 인코딩 단계에서 추가되는 이유는 base64가 원래 이진 내용을 전자 메일로 보내기위한 인코딩 메커니즘으로 고안 되었기 때문입니다. 필요하지 않은 경우 교체하십시오.


1
이것은 내 Android 앱 (Java의 Base64 라이브러리)에서 발생했습니다. 나는이 이상한 일과 완전히 혼동되었다. 말 그대로 1 시간 동안 무엇이 잘못되었는지 알아 낸 다음 오류를 검색했습니다. 이 의견은 6 년이 지난 후에도 레거시 문제를 이해하는 데 도움이됩니다.
burglarhobbit

5

다음과 같이 벗겨 지거나 무시해야합니다.

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

이 솔루션은 더럽습니다.
Arnold Roa

1
@yaauie ( 제안 된 편집을 통해 ) : 크게 변경하는 편집은 일반적으로 수행하지 않아야합니다. 별도의 답변으로 게시하는 것이 좋습니다.
Pokechu22


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.