base64编码长度参数

我正在解码base64字符串,修改它,并用Ruby重新编码它。 重新编码时的问题是ruby编码库在60个左右的字符后添加了一个换行符。 如何告诉它每行限制没有最大字符数?

val = "QmFzZTY==" decoded_val = Base64.decode64(val) encoded_val = Base64.encode64(val) #=> QmFzZTY0IGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBhIG51bWJlciBvZiBzaW1p # bGFyIGVuY29kaW5nIHNjaGVtZXMgdGhhdCBlbmNvZGUgYmluYXJ5IGRhdGEg # YnkgdHJlYXRpbmcgaXQgbnVtZXJpY2FsbHkgYW5kIHRyYW5zbGF0aW5nIGl0 # IGludG8gYSBiYXNlIDY0IHJlcHJlc2VudGF0aW9uLiBUaGUgQmFzZTY0IHRl # cm0gb3JpZ2luYXRlcyBmcm9tIGEgc3BlY2lmaWMgTUlNRSBjb250ZW50IHRy # YW5zZmVyIGVuY29kaW5nLg0KDQpCYXNlNjQgZW5jb2Rpbmcgc2NoZW1lcyBh # cmUgY29tbW9ubHkgdXNlZCB3aGVuIHRoZXJlIGlzIGEgbmVlZCB0byBlbmNv # ZGUgYmluYXJ5IGRhdGEgdGhhdCBuZWVkcyBiZSBzdG9yZWQgYW5kIHRyYW5z # ZmVycmVkIG92ZXIgbWVkaWEgdGhhdCBhcmUgZGVzaWduZWQgdG8gZGVhbCB3 # aXRoIHRleHR1YWwgZGF0YS4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUg # ZGF0YSByZW1haW5zIGludGFjdCB3aXRob3V0IG1vZGlmaWNhdGlvbiBkdXJp # bmcgdHJhbnNwb3J0LiBCYXNlNjQgaXMgdXNlZCBjb21tb25seSBpbiBhIG51 # bWJlciBvZiBhcHBsaWNhdGlvbnMgaW5jbHVkaW5nIGVtYWlsIHZpYSBNSU1F # LCBhbmQgc3RvcmluZyBjb21wbGV4IGRhdGEgaW4gWE1MLg== 

RFC 4648:Base16,Base32和Base64数据编码有这样的说法:

3.3。 解码编码数据中的非字母字符
[…]
如果编码数据在解释基本编码数据时包含基本字母表之外的字符,则必须拒绝编码数据,除非引用本文档的规范另有明确说明。 正如MIME所做的那样,这样的规范可能会在解释数据时简单地忽略基本编码字母表之外的字符(“你接受的是自由的”)。 请注意,这意味着任何相邻的回车符/换行符(CRLF)字符构成“非字母字符”并被忽略。

所以换行很好,几乎所有东西都会忽略它们,即使它们没有严格遵守RFC 4648。

此外, 精细的手册有这样的说法:

encode64(BIN)

返回Base64编码的bin版本。 此方法符合RFC 2045.每60个编码的字符串添加换行符[原文如此]。

所以60个字符的行长度是有意和指定的。 如果你想要严格的RFC 4648 Base64(即没有新行),那么就有strict_encode64

strict_encode64(BIN)

返回Base64编码的bin版本。 此方法符合RFC 4648.不添加换行符。

所以你可以说Base64.strict_encode64(val)来获得你正在寻找的输出。

作为参考,这是RFC 2045的相关部分 :

6.8。 Base64内容传输编码
[…]
编码的输出流必须以不超过76个字符的行表示。 解码软件必须忽略表1中未找到的所有换行符或其他字符。

因此,60字符的行长度有些随意,但符合RFC 2045,因为60 < 76