假设不变的ASCII编码,Rubyist方式解码这个编码的字符串

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

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

例如,character =代表一个整数13

我的代码最初使用ord获取字符的ASCII代码,然后从中减去48 ,如下所示:

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

…这完全有效,假设val仅包含该表中列出的字符(这在其他地方已经过validation)。

但是,在另一个问题中 ,我被告知:

您要求使用Ruby方式使用ord,使用它是违反Ruby方式的。

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

所以我的问题是:

首先,Rubyist在上面编写函数的方法是什么? 中学, 为什么在这里使用orr非Rubyist练习?

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

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

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

带有"C*"参数的unpack方法将每个字符转换为8位无符号整数。

在您的情况下,可能ord是完全安全和适当的,因为源数据应始终以相同的方式编码。 特别是如果在读取数据时将编码设置为'US-ASCII' (尽管使用的格式对于’ASCII-8BIT’,’UTF-8’和’ISO-8859’来说是安全的,这可能是它的重点 -它似乎对许多转换具有弹性,并且不使用所有可能的字节值)。 但是, ord 旨在与字符语义一起使用,从技术上讲,您需要字节语义。 对于基本的ASCII和变体,没有实际的区别,所有低于128的字节值都是相同的字符代码。

我建议使用String#unpack作为将二进制输入转换为Ruby数据类型的通用方法,但是没有“使用带偏移量的这个字节”的unpack代码,因此这将成为一个由两部分组成的过程。