2012-11-09 130 views
4

我正在解碼base64字符串,修改它,並用Ruby重新編碼。當我重新編碼它時,問題在於ruby編碼庫在60個左右字符之後添加了一個換行符。我怎麼能告訴它沒有每行限制的最大字符數?base64編碼長度參數

val = "QmFzZTY0IGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBhIG51bWJlciBvZiBzaW1pbGFyIGVuY29kaW5nIHNjaGVtZXMgdGhhdCBlbmNvZGUgYmluYXJ5IGRhdGEgYnkgdHJlYXRpbmcgaXQgbnVtZXJpY2FsbHkgYW5kIHRyYW5zbGF0aW5nIGl0IGludG8gYSBiYXNlIDY0IHJlcHJlc2VudGF0aW9uLiBUaGUgQmFzZTY0IHRlcm0gb3JpZ2luYXRlcyBmcm9tIGEgc3BlY2lmaWMgTUlNRSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nLg0KDQpCYXNlNjQgZW5jb2Rpbmcgc2NoZW1lcyBhcmUgY29tbW9ubHkgdXNlZCB3aGVuIHRoZXJlIGlzIGEgbmVlZCB0byBlbmNvZGUgYmluYXJ5IGRhdGEgdGhhdCBuZWVkcyBiZSBzdG9yZWQgYW5kIHRyYW5zZmVycmVkIG92ZXIgbWVkaWEgdGhhdCBhcmUgZGVzaWduZWQgdG8gZGVhbCB3aXRoIHRleHR1YWwgZGF0YS4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSByZW1haW5zIGludGFjdCB3aXRob3V0IG1vZGlmaWNhdGlvbiBkdXJpbmcgdHJhbnNwb3J0LiBCYXNlNjQgaXMgdXNlZCBjb21tb25seSBpbiBhIG51bWJlciBvZiBhcHBsaWNhdGlvbnMgaW5jbHVkaW5nIGVtYWlsIHZpYSBNSU1FLCBhbmQgc3RvcmluZyBjb21wbGV4IGRhdGEgaW4gWE1MLg==" 

decoded_val = Base64.decode64(val) 
encoded_val = Base64.encode64(val) 

#=> QmFzZTY0IGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBhIG51bWJlciBvZiBzaW1p 
# bGFyIGVuY29kaW5nIHNjaGVtZXMgdGhhdCBlbmNvZGUgYmluYXJ5IGRhdGEg 
# YnkgdHJlYXRpbmcgaXQgbnVtZXJpY2FsbHkgYW5kIHRyYW5zbGF0aW5nIGl0 
# IGludG8gYSBiYXNlIDY0IHJlcHJlc2VudGF0aW9uLiBUaGUgQmFzZTY0IHRl 
# cm0gb3JpZ2luYXRlcyBmcm9tIGEgc3BlY2lmaWMgTUlNRSBjb250ZW50IHRy 
# YW5zZmVyIGVuY29kaW5nLg0KDQpCYXNlNjQgZW5jb2Rpbmcgc2NoZW1lcyBh 
# cmUgY29tbW9ubHkgdXNlZCB3aGVuIHRoZXJlIGlzIGEgbmVlZCB0byBlbmNv 
# ZGUgYmluYXJ5IGRhdGEgdGhhdCBuZWVkcyBiZSBzdG9yZWQgYW5kIHRyYW5z 
# ZmVycmVkIG92ZXIgbWVkaWEgdGhhdCBhcmUgZGVzaWduZWQgdG8gZGVhbCB3 
# aXRoIHRleHR1YWwgZGF0YS4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUg 
# ZGF0YSByZW1haW5zIGludGFjdCB3aXRob3V0IG1vZGlmaWNhdGlvbiBkdXJp 
# bmcgdHJhbnNwb3J0LiBCYXNlNjQgaXMgdXNlZCBjb21tb25seSBpbiBhIG51 
# bWJlciBvZiBhcHBsaWNhdGlvbnMgaW5jbHVkaW5nIGVtYWlsIHZpYSBNSU1F 
# LCBhbmQgc3RvcmluZyBjb21wbGV4IGRhdGEgaW4gWE1MLg== 
+0

你確定這不是因爲你的終端?只是試了一下,它對我來說沒有換行符 –

+0

在Windows 7命令提示符下,我將寬度設置爲300,當我第一次放置該字符串時沒有換行符,但在base64之後它似乎在那裏 – user391986

+0

您是否嘗試過輸出到一個文件,看看是否有所作爲? –

回答

8

RFC 4648: The Base16, Base32, and Base64 Data Encodings有這樣一段話:

3.3。在編碼數據中的非字母字符的解釋
[...]
實現必須拒絕該編碼數據,如果它包含基字母表以外 字符解釋基礎編碼的數據 時,除非本說明書中引用該文獻明確地否則爲 。正如MIME 所做的那樣,此類規範可能會改爲聲明基本編碼字母表外的字符在解釋數據時簡單地被忽略(「在您接受的內容中應該是自由的」)。 請注意,這意味着任何相鄰的回車符(CRLF)字符構成「非字母字符」,並且 將被忽略。

所以換行符是很好,幾乎所有會忽略他們,即使他們不符合RFC 4648.

還嚴格符合要求,fine manual有這樣一段話:

編碼64(bin)

返回Base64編碼版本bin。此方法符合RFC 2045.換行符被添加到每60個編碼字符[原文如此]。

所以60個字符行的長度是有意識的和指定的。如果你想嚴格RFC 4648的Base64(即不換行),再有就是strict_encode64

strict_encode64(BIN)

返回bin Base64編碼版本。此方法符合RFC 4648.不添加換行符。

所以你可以說Base64.strict_encode64(val)得到你要找的輸出。

以供參考,這裏的relevant section of RFC 2045

6.8。 Base64的內容傳輸編碼
[...]
編碼輸出流必須的每個不多 超過76個字符的行來表示。表1中的所有換行符或其他字符 必須被解碼軟件忽略。

所以60字符線的長度是有點武斷,但由於60 < 76符合RFC 2045。

+1

「如果你不想嚴格...」,那麼使用「嚴格...」?這聽起來很奇怪。我認爲沒有換行並不嚴格遵守標準。你的「如果你不想嚴格......」是誤導性的。 – sawa

+0

@sawa:*不*是我的手沒有打字我的大腦告訴他們,固定。感謝您的高舉。 –

+0

非常感謝! – user391986