将十六进制字符串转换(解码)为二进制字符串

时间:2009-05-14 08:14:10

标签: ruby

如何在Ruby中将"1234567890"转换为"\x12\x34\x56\x78\x90"

6 个答案:

答案 0 :(得分:28)

试试这个:

["1234567890"].pack('H*')

答案 1 :(得分:10)

Ruby 1.8 -

hex_string.to_a.pack('H*')

Ruby 1.9 / Ruby 1.8 -

Array(hex_string).pack('H*')

答案 2 :(得分:7)

假设你有一个格式正确的十六进制字符串(十六进制数字对),你可以打包成二进制,或者解压缩到十六进制,简单地说&有效,像这样:

string = '0123456789ABCDEF'
binary = [string].pack('H*')     # case-insensitive
 => "\x01#Eg\x89\xAB\xCD\xEF"
hex = binary.unpack('H*').first  # emits lowercase
 => "012345679abcdef"

答案 3 :(得分:4)

class String

  def hex2bin
    s = self
    raise "Not a valid hex string" unless(s =~ /^[\da-fA-F]+$/)
    s = '0' + s if((s.length & 1) != 0)
    s.scan(/../).map{ |b| b.to_i(16) }.pack('C*')
  end

  def bin2hex
    self.unpack('C*').map{ |b| "%02X" % b }.join('')
  end

end

答案 4 :(得分:2)

如果您有一个包含数字的字符串,并且您希望将每个字符串扫描为数字十六进制字节,我认为这就是您想要的:

"1234567890".scan(/\d\d/).map {|num| Integer("0x#{num}")}

答案 5 :(得分:0)

(0..4).map { |x| "0x%X" % (("1234567890".to_i(16) >> 8 * x) & 255) }.reverse