根据规范,它们应该是相同的长度,长度为 36 的字符串应转换为长度为 48 的字符串,例如:
bin = "123456789012345678901234567890123456"
[49] pry(main)> [bin].pack("m").length
=> 49
[50] pry(main)> [bin].pack("u").length
=> 50
[54] pry(main)> [bin].pack("m")
=> "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2\n"
[55] pry(main)> [bin].pack("u")
=> "D,3(S-#4V-S@Y,\#$R,S0U-C<X.3`Q,C,T-38W.#DP,3(S-#4V\n"
为了补偿“有趣的换行符”,我们在 base64 编码(pack('m')
变体)中获得了正确的长度,但我不知道如何在 uuencoding(pack('u')
变体)中获得正确的行长度。
我真的需要 uuencoded 字符串长度为 48 个字符 :) 这里有什么问题?
更新
我做了自己的 uuencode 实现,创建了一个生成位图然后拆分位图等以进行 uuencode 实现的方法,正如规范的提供者在规范中有用地解释的那样
def to_bitmap bytes
bytes.scan(/./).map{|b| b.ord.to_s(2).rjust(8, "0")}.join
end
[5] pry(main)> to_bitmap(str).scan(/.{6}/).map{|b| (from_bitmap("00"+b).ord+0x20).chr }.join
=> ",3(S-#4V-S@Y,\#$R,S0U-C<X.3 Q,C,T-38W.#DP,3(S-#4V"
[6] pry(main)> to_bitmap(str).scan(/.{6}/).map{|b| (from_bitmap("00"+b).ord+0x20).chr }.join.length
=> 48
我认为这是一件好事,它有点像 uuencode,但在几个地方有所不同:
,3(S-#4V-S@Y,\#$R,S0U-C<X.3 Q,C,T-38W.#DP,3(S-#4V
D,3(S-#4V-S@Y,\#$R,S0U-C<X.3`Q,C,T-38W.#DP,3(S-#4V\n
奇怪,我想这是我正在实施的规范是使用“uuencode”而不是完全uuencode,尽管他们声称通用软件库支持这种格式,我是否遗漏了什么或者这对于某些人半途而废的实现来说似乎是胡说八道和解决方法uuencode 的?