¿Cómo puedo convertir "1234567890" a "\x12\x34\x56\x78\x90" en Ruby?

  • A juzgar por las respuestas, la salida se supone que es «\x12\x34\x56\x78\x90», en lugar de una Matriz de Fixnum o un sintácticamente válido Hash.
InformationsquelleAutor | 2009-05-14

6 Comentarios

  1. 29

    Intente esto:

    ["1234567890"].pack('H*')
    • Esta es sin duda la solución más elegante. La parte superior votado respuesta no va a hacer lo que se le pide.
  2. 11

    Ruby 1.8 –

    hex_string.to_a.pack('H*')

    Ruby 1.9 /Ruby 1.8 –

    Array(hex_string).pack('H*')
    • Archivo.open(‘output.txt’, ‘w+’) {|f| f.escribir(IO.read(‘input.txt’).to_a.pack(‘H*’)) }
    • No estoy seguro de su respuesta se supone que funciona. Podría dar un mejor ejemplo de uso de la cadena hexadecimal en la pregunta? Cuando he probado el código que me dieron: d:\>irb irb(main):001:0> hex_string = "1234567890" => "1234567890" irb(main):002:0> hex_string.to_a.pack('H*') NoMethodError: undefined method to_a’ para «1234567890»:Cadena de (irb):2 de C:/Ruby192/bin/irb:12:in <main>' irb(main):003:0>
    • Array(hex_string).pack('H*') obras. to_a no funciona.
    • Ruby 1.9 no tiene String#to_a método. He actualizado mi respuesta a reflejar eso.
  3. 7

    Suponiendo que se tiene una bien formada cadena hexadecimal (pares de dígitos hexadecimales), usted puede empacar en binario, o desempaquetar a hex, simplemente & de manera eficiente, como este:

    string = '0123456789ABCDEF'
    binary = [string].pack('H*')     # case-insensitive
     => "\x01#Eg\x89\xAB\xCD\xEF"
    hex = binary.unpack('H*').first  # emits lowercase
     => "012345679abcdef"
  4. 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
  5. 2

    Si usted tiene una cadena que contiene los números y usted desea analizar cada numérico hexadecimal byte, yo creo que esto es lo que usted desea:

    "1234567890".scan(/\d\d/).map {|num| Integer("0x#{num}")}
    • Yo lo habría hecho: «1234567890».scan(/\d\d/).map {|i| i.to_i(16) }
    • O, para el manejo de hex de caracteres, como se solicitó, "1234567890abcdef".scan(/[0-9A-Fa-f]{2}/).map { |i| i.to_i(16) }.

Dejar respuesta

Please enter your comment!
Please enter your name here