假设不变的 ASCII 编码,用 Rubyist 方法解码该编码字符串

2024-03-25

我的程序是二进制协议的解码器。该二进制协议中的字段之一是编码的String。中的每个角色String是可打印的,并且代表一个整数值。根据我正在解码的协议的规范,它表示的整数值取自下表,其中列出了所有可能的字符:

Character   Value
=========   =====
0           0
1           1
2           2
3           3
     [...]
:           10
;           11
<           12
=           13
     [...]
B           18

例如,角色=代表一个积分13.

我的代码最初使用的是ord得到该字符的 ASCII 码,然后减去48从那以后,像这样:

def Decode(val)
  val[0].ord - 48
end

...这完美地工作,假设val仅包含该表中列出的字符(这已在其他地方得到验证)。

然而,在另一个问题 https://stackoverflow.com/questions/21784206/best-practice-to-eliminate-magic-numbers-within-a-member-function#21784206,有人告诉我:

您正在寻求一种 Ruby 方式来使用 ord,但使用它是反对的 红宝石方式。

在我看来,这ord正是我在这里需要的,所以我不明白为什么使用ord这不是做我想做的事情的 Rubyist 方式。

所以我的问题是:

首先,也是最重要的,用 Rubyist 方式编写上面的函数是什么? 次要,why正在使用ord这是非 Rubyist 的做法吗?

关于编码的注释:我正在解码的这个协议精确地指定了这些字符串是 ASCII 编码的。这里不可能有其他编码。像这样的协议在我的行业(股票和商品市场)中非常常见。


我猜想将字符串解码为整数数组的更快的 Rubyistic 方法是unpack method:

"=01:".unpack("C*").map {|v| v - 48}
>> [13, 0, 1, 10]

The unpack http://rubydoc.info/stdlib/core/String%3aunpack方法,用"C*"param,将每个字符转换为 8 位无符号整数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

假设不变的 ASCII 编码,用 Rubyist 方法解码该编码字符串 的相关文章

随机推荐