我的程序是二进制协议的解码器。该二进制协议中的字段之一是编码的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(使用前将#替换为@)