`
counsellor
  • 浏览: 4098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ruby的base64编码的诟病

    博客分类:
  • ruby
阅读更多
str_raw = "To be prepared is half the victory."
str_encoded = [str_raw].pack('m')

 或者

["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"].pack("m")
=> "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJT\nVFVWV1hZWg==\n"

 

上面两段代码是ruby提供的base64编码函数,很方便。

 

不过对于某些特殊需求的人,这个函数似乎是有缺陷的。

 

第一类人-只想要编码的串不需要换行:

       请使用

               # File base64.rb, line 64
def strict_encode64(bin)
  [bin].pack("m0")
end

 官方说明:

Returns the Base64-encoded version of bin. This method complies with RFC 4648. No line feeds are added.

 

第二类人-编码和换行都要:

       请使用

               # File base64.rb, line 37
def encode64(bin)
  [bin].pack("m")
end

 官方说明:

Returns the Base64-encoded version of bin. This method complies with RFC 2045. Line feeds are added to every 60 encoded characters.

 

好,工作结束,大家都很happy~赶紧回家吃饭吧~

 

且慢,少侠请留步,其实不是这样的。

带换行的形式,官网说“This method complies with RFC 2045”。是这样吗?

 

https://tools.ietf.org/html/rfc2045#section-6.8 写道
Freed & Borenstein Standards Track [Page 25]

RFC 2045 Internet Message Bodies November 1996


such assurance is possible, however, when the number of octets
transmitted was a multiple of three and no "=" characters are
present.

Any characters outside of the base64 alphabet are to be ignored in
base64-encoded data.

Care must be taken to use the proper octets for line breaks if base64
encoding is applied directly to text material that has not been
converted to canonical form. In particular, text line breaks must be
converted into CRLF sequences prior to base64 encoding. The
important thing to note is that this may be done directly by the
encoder rather than in a prior canonicalization step in some
implementations.

NOTE: There is no need to worry about quoting potential boundary
delimiters within base64-encoded bodies within multipart entities
because no hyphen characters are used in the base64 encoding.

 

的确,在RFC 2045中说MIME的base64编码是60个字符一个line feed。但是line feed并不是<LF>而是<CRLF>。在wiki中也会发现PEMRFC 2045RFC 4880等base64编码的 line feed也都是<CRLF>,所以ruby官方的说明并不完全正确。

 

正确的方式是:

def encode64(bin)
  [bin].pack("m").gsub(/\n/,"\r\n")
end

 

当然代码没有验证,我没逗你。好久不用ruby了,python比较合手。

忘不了第三类人的-要url的base64编码:

               # File base64.rb, line 80
def urlsafe_encode64(bin)
  strict_encode64(bin).tr("+/", "-_")
end
            

 官方说明:

Returns the Base64-encoded version of bin. This method complies with “Base 64 Encoding with URL and Filename Safe Alphabet” in RFC 4648. The alphabet uses ‘-’ instead of ‘+’ and ‘_’ instead of ‘/’.

 

 

 

 

分享到:
评论

相关推荐

    gbk-utf8-base64编解码工具

    界面工具,输入原始内容,选择编码类型,进行编码和解码,字符集支持GBK,UTF-8,编码方式支持base64,运行于windows下,是开发中常用的好工具.

    Ruby 与编码

    Ruby 与编码 常见问题 * 乱码的问题 * Ruby 中 Unable to convert "\x89" from ASCII-8BIT to UTF8 *Incompatible character encodings: ASCII- 8BIT and UTF-8

    gbk-utf8-base64工具

    实用的base64编码解码工具,支持字符集GBK,UTF8两种,支持编码和解码,下载即可使用,小巧方便,适合开发人员使用,欢迎试用.

    carrierwave-base64:将编码为base64字符串的文件直接上传到carrierwave

    载波:: Base64 将编码为base64的文件上传到载波。 这个小宝石对于与移动设备进行交互的API很有用。 该宝石需要Ruby 2.0或更高版本。安装将宝石添加到您的Gemfile中: gem 'carrierwave-base64' 如果需要蒙古包支持,...

    windows 安装 Ruby 安装包 64 位

    下面我们将详细介绍如何在Windows上安装64位的Ruby开发环境。 首先,你需要下载Ruby的安装包。在这个例子中,你已经有一个名为"rubyinstaller-devkit-3.0.3-1-x64_2.exe"的文件,这通常包含了Ruby解释器和DevKit。...

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    本文将深入探讨Ruby语言中的类变量、全局变量、实例变量,以及多态的概念,并结合Ruby编码规范来阐述如何有效地编写代码。 一、类变量 类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的...

    ruby编码转换

    ### Ruby 1.9 编码转换详解 在Ruby 1.9中,字符串处理方面的改进使得编码转换变得更加直观和高效。本篇文章将详细介绍如何在Ruby 1.9环境中进行编码转换,包括如何查看字符串的编码信息、如何强制更改字符串的编码...

    10.5 多态、为什么ruby、ruby编码规范.rar

    综上所述,Ruby的多态性是其魅力的一部分,它提供了灵活性和代码复用,而Ruby编码规范则帮助开发者编写出更易读、易维护的代码。了解并掌握这些知识点,对于深入理解Ruby编程以及提升编程技能至关重要。

    DEV ruby x64 V2.5.1-1 便携版

    DEV ruby x64 V2.5.1-1 便携版 DEV ruby x64 V2.5.1-1 Portable

    ruby x64 exe文件

    在“ruby x64 exe文件”中,"x64"指的是64位版本的Ruby解释器。64位系统能够处理更大的内存地址空间,通常意味着更好的性能和更大的内存支持,这对于运行大型或资源密集型的应用程序尤其重要。Ruby的64位版本能够...

    base91:Gem 使用 basE91 编码和解码数据

    Base91 Gem 使用 basE91 编码和解码数据安装将此行添加到应用程序的 Gemfile 中: gem 'base91' 然后执行: $ bundle或者自己安装: $ gem install base91用法 require 'base91'Base91 . encode ( "base91 is much ...

    base32:提供base32解码和编码的库

    该软件包包含base32,这是Ruby扩展,用于根据RFC 3548在base32中进行编码和解码。 下载 最新版本的base32可以在以下位置找到 安装 正常安装 您可以从分发目录中使用以下命令安装base32。 rake install 宝石安装 ...

    thrift-base64-ruby:使用 Base64 进行 Thrift 对象序列化反序列化

    这个 gem 包含用于处理 Base64 编码的 Thrift 对象的辅助类。 最终代码需要持久化一个序列化的 Thrift 对象。 二进制协议是最快的。 不幸的是,二进制不能很好地用于纯文本协议。 Base64 解决了这个问题。 它也比...

    Ruby-Geocoder完整的Ruby地理编码解决方案

    Ruby-Geocoder是一款强大的Ruby库,它为开发者提供了完整的地理编码解决方案。这个库的主要功能包括正向地理编码、反向地理编码以及距离查询,适用于基于地理位置的应用开发。下面将详细介绍这些功能及其应用。 1. ...

    ruby-debug-base19-0.11.26.gem

    ruby-debug-base19-0.11.26.gem

    Ruby2.7.1_1_x64

    Ruby2.7.1是该语言的一个稳定版本,专为64位(x64)架构设计,提供更高的性能和更好的资源管理。RubyInstaller是Windows平台上安装Ruby的首选工具,它使得在Windows系统上配置Ruby环境变得简单易行。 Ruby2.7.1_1_x...

    ruby-2.5.3-x64 下载

    标题中的"ruby-2.5.3-x64"指的是Ruby语言的特定版本,2.5.3,这是一个64位的构建。Ruby的版本迭代频繁,每个新版本通常会包含性能优化、新的特性和错误修复。2.5.3是2018年发布的一个稳定版本,它带来了诸如改进的...

    ruby安装包-rubyinstaller-devkit-3.0.2-1-x64.zip

    标题中的"rubyinstaller-devkit-3.0.2-1-x64.zip"表明这是RubyInstaller的一个版本,包含了Ruby 3.0.2的开发工具包,适用于64位Windows操作系统。这个压缩包中包含了一个名为"rubyinstaller-devkit-3.0.2-1-x64.exe...

    DEV ruby x64 V2.5.1-1-nodevkit 便携版

    DEV ruby x64 V2.5.1-1-nodevkit 便携版 DEV ruby x64 V2.5.1-1-nodevkit Portable

    ruby 2.3.1 windows64位安装包

    在Windows 64位系统上安装Ruby 2.3.1,你需要下载对应的安装包,如"rubyinstaller-2.3.1-x64.exe"。这个文件是一个可执行程序,用于在Windows操作系统上安装Ruby环境。运行这个安装程序,会引导你完成整个安装过程。...

Global site tag (gtag.js) - Google Analytics