4

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

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==
4

1 回答 1

10

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

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

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

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

编码64(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 Content-Transfer-Encoding
[...]
编码的输出流必须以每行不超过 76 个字符的形式表示。解码软件必须忽略表 1 中未找到的所有换行符或其他字符。

所以 60 个字符的行长度有点随意,但符合 RFC 2045,因为60 < 76.

于 2012-11-09T04:09:04.583 回答