base64编码长度参数

时间:2012-11-09 03:29:35

标签: ruby base64

我正在解码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==

1 个答案:

答案 0 :(得分:8)

RFC 4648: The Base16, Base32, and Base64 Data Encodings有这样的说法:

  

<强> 3.3。解码编码数据中的非字母字符
  [...]
  实现必须拒绝编码数据(如果包含)   解释基本编码时基本字母表外的字符   数据,除非明确引用本文档的规范   另有说明。这些规范可以改为陈述为MIME   是的,基本编码字母表之外的字符应该   在解释数据时简单地被忽略(“对你来说是开明的”   接受“)。注意这意味着任何相邻的回车/   换行符(CRLF)构成“非字母字符”和   被忽略了。

所以新行很好,几乎所有内容都会忽略它们,即使它们并不严格遵守RFC 4648。

另外,fine manual有这样的说法:

  

<强> encode64(bin)中

     

返回bin的Base64编码版本。此方法符合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 Content-Transfer-Encoding
  [...]
  编码的输出流必须以不再行的方式表示   每个超过76个字符。所有换行符或其他字符都没有   解码软件必须忽略表1中的内容。

因此,60字符行长度有些随意,但自60 < 76以来符合RFC 2045。