4

base64文字列をデコードし、変更して、Rubyで再エンコードしています。再エンコードするときの問題は、rubyエンコードライブラリが60文字程度の後に改行を追加していることです。1行あたりの最大文字数を制限しないようにするにはどうすればよいですか?

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に厳密に準拠していなくても、ほとんどすべてが改行を無視します。

また、細かいマニュアルには次のように書かれています。

encode64(bin)

Base64でエンコードされたバージョンのを返しますbin。このメソッドはRFC2045に準拠しています。ラインフィードは、エンコードされた60個の文字ごとに追加されます[原文のまま]。

したがって、60文字の行の長さは意図的であり、指定されています。厳密なRFC4648Base64が必要な場合(つまり、改行がない場合)、次のようになりますstrict_encode64

strict_encode64(bin)

Base64でエンコードされたバージョンのを返しますbin。このメソッドはRFC4648に準拠しています。改行は追加されません。

だからあなたはBase64.strict_encode64(val)あなたが探している出力を得るために言うことができます。

参考までに、RFC2045の関連セクションを次に示します。

6.8。Base64 Content-Transfer-Encoding
[...]
エンコードされた出力ストリームは、それぞれ76文字以内の行で表す必要があります。表1にないすべての改行またはその他の文字は、デコードソフトウェアで無視する必要があります。

したがって、60文字の行の長さは多少任意ですが、RFC2045に準拠しています60 < 76

于 2012-11-09T04:09:04.583 に答える