En muchos idiomas hay un par de funciones, chr()
y ord()
, que convierten entre números y valores de caracteres. En algunos idiomas, ord()
se llama asc()
.
Ruby tiene Integer#chr
, que funciona muy bien:
>> 65.chr
A
Lo suficientemente justo. Pero, ¿cómo vas al otro lado?
"A".each_byte do |byte|
puts byte
end
huellas dactilares:
65
y eso se acerca bastante a lo que quiero. Pero realmente prefiero evitar un bucle: estoy buscando algo lo suficientemente corto como para que sea legible al declarar un const
.
Tratar:
fuente
Me gustaría hacer +1 en dylanfm y en el comentario de AShelly, pero agregar el [0]:
'A'.unpack('C')[0]
La llamada al desempaquetado devuelve una matriz que contiene un solo entero, que no siempre se acepta cuando se desea un entero:
Estoy intentando escribir código que funcione en Ruby 1.8.1, 1.8.7 y 1.9.2.
Editado para pasar C para descomprimir en mayúsculas, porque desempaquetar ("c") me da -1 donde ord () me da 255 (a pesar de ejecutarse en una plataforma donde el carácter de C está firmado).
fuente
Me encontré con esto mientras preparaba una versión Ruby pura de Stringprep a través de RFC.
Tenga en cuenta que
chr
falla fuera de [0,255], en su lugar use reemplazos portátiles 1.9.x - 2.1.x:fuente
char
y su inversa en el caso de Unicode correctamenteAdemás, si tiene el carácter en una cadena y desea decodificarlo sin un bucle:
fuente
Qué tal si
fuente
Puedes tener estos:
fuente
Si no le importa sacar los valores de una matriz, puede usar
"A".bytes
fuente
Estoy escribiendo código para 1.8.6 y 1.9.3 y no pude hacer que ninguna de estas soluciones funcione en ambos entornos :(
Sin embargo, encontré otra solución: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Eso tampoco funcionó para mí, pero lo adapté para mi uso:
Una vez hecho esto, lo siguiente funcionará en ambos entornos.
fuente
"A".unpack("C")[0]
estaba dirigida a Ruby 1.8.1, Ruby 1.8.7 y Ruby 1.9.2. ¿Falla en su entorno? ¿Qué tipo de fracaso?self.status = tagAccountString[4].unpack('C')[0]
En 1.8.6 obtengoException undefined method
desempaquetar 'para 0: Fixnum procesando datos de la etiqueta principal en búfer - salir' El siguiente código funciona (con mi solución propuesta) en ambos entornosself.status = tagAccountString[4].ord
Cualquier consejo (por ejemplo, una mejor solución) es más que bienvenidotagAccountString[4]
devuelve un String en Rubies más nuevos pero se usa para devolver un Fixnum en Ruby 1.8. Por eso vio el errorundefined method unpack for 0:Fixnum
. Puede usarstatus = tagAccountString[4,1].unpack('C')[0]
o inclusostatus, = tagAccountString.unpack('xxxxC')
si siempre desea ignorar cuatro caracteres y convertir el siguiente.