Answers:
我想+1 dylanfm和AShelly的评论,但添加[0]:
'A'.unpack('C')[0]
unpack调用返回一个包含单个整数的Array,在需要整数的地方并不总是会接受该数组:
$ ruby -e'printf(“ 0x%02X \ n”,“ A” .unpack(“ C”))' -e:1:在`printf'中:无法将Array转换为Integer(TypeError) 来自-e:1 $ ruby -e'printf(“ 0x%02X \ n”,“ A” .unpack(“ C”)[0])' 0x41 $
我正在尝试编写适用于Ruby 1.8.1、1.8.7和1.9.2的代码。
被编辑为以大写形式将C传递给unpack,因为unpack(“ c”)给我-1,而ord()给我255(尽管运行在对C的char进行签名的平台上)。
刚通过RFC将Stringprep的纯Ruby版本组合在一起时碰到了这一点。
当心chr
在[0,255]之外失败的故障,请使用1.9.x-2.1.x便携式替代品:
[22] pry(main)> "\u0221".ord.chr
RangeError: 545 out of char range
from (pry):2:in 'chr'
[23] pry(main)> x = "\u0221".unpack('U')[0]
=> 545
[24] pry(main)> [x].pack('U')
=> "ȡ"
[25] pry(main)>
char
正确,它在统一的情况下,逆
另外,如果您在字符串中包含char并希望不循环而对其进行解码:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
您可以拥有以下这些:
65.chr.ord
'a'.ord.chr
我正在为1.8.6和1.9.3编写代码,但我无法在所有两种环境中都能使用这些解决方案:(
但是,我遇到了另一个解决方案:http : //smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
那对我也不起作用,但我对其进行了调整以供使用:
unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end
完成此操作后,以下内容将在两种环境下均适用
'A'[0].ord
"A".unpack("C")[0]
,其针对的是Ruby 1.8.1,Ruby 1.8.7和Ruby 1.9.2。它在您的环境中是否失败?什么样的失败?
self.status = tagAccountString[4].unpack('C')[0]
在1.8.6中,我将 Exception undefined method
解压缩为0:Fixnum处理主要的缓冲标签数据-退出以下代码在两种环境下均有效(使用我建议的解决方案) self.status = tagAccountString[4].ord
任何建议(例如,更好的解决方案)都非常受欢迎
tagAccountString[4]
在较新的Ruby中返回一个String,但在Ruby 1.8中用于返回一个Fixnum。因此,您会看到错误undefined method unpack for 0:Fixnum
。您可以使用,status = tagAccountString[4,1].unpack('C')[0]
或者即使status, = tagAccountString.unpack('xxxxC')
您始终想忽略四个字符并转换下一个字符。