Em muitas línguas, há um par de funções chr()
e ord()
, que convertem entre números e valores de caracteres. Em alguns idiomas, ord()
é chamado asc()
.
Ruby tem Integer#chr
, o que funciona muito bem:
>> 65.chr
A
Justo. Mas como você segue o outro caminho?
"A".each_byte do |byte|
puts byte
end
estampas:
65
e isso é muito próximo do que eu quero. Mas prefiro evitar um loop - estou procurando algo curto o suficiente para ser legível ao declarar um const
.
Experimentar:
fonte
Eu gostaria de marcar o comentário de dylanfm e AShelly com +1, mas adicionar o [0]:
'A'.unpack('C')[0]
A chamada unpack retorna um Array contendo um único inteiro, que nem sempre é aceito onde um inteiro é desejado:
Estou tentando escrever um código que funcione em Ruby 1.8.1, 1.8.7 e 1.9.2.
Editado para passar C para descompactar em maiúsculas, porque descompactar ("c") me dá -1 onde ord () me dá 255 (apesar de rodar em uma plataforma onde o char de C é assinado).
fonte
Acabei de descobrir isso ao montar uma versão Ruby pura de Stringprep via RFCs.
Cuidado com a
chr
falha fora de [0,255], em vez disso, use substituições portáteis 1.9.x - 2.1.x:fonte
char
e seu inverso no caso do Unicode corretamenteAlém disso, se você tiver o caractere em uma string e quiser decodificá-lo sem um loop:
fonte
E se
fonte
Você pode ter estes:
fonte
Se você não se importa em extrair os valores de uma matriz, você pode usar
"A".bytes
fonte
Estou escrevendo o código para 1.8.6 e 1.9.3 e não consegui fazer nenhuma dessas soluções funcionar em ambos os ambientes :(
No entanto, me deparei com outra solução: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Isso também não funcionou para mim, mas eu adaptei para meu uso:
Feito isso, o seguinte funcionará em ambos os ambientes
fonte
"A".unpack("C")[0]
ele estava visando Ruby 1.8.1, Ruby 1.8.7 e Ruby 1.9.2. Ele falha em seu ambiente? Que tipo de falha?self.status = tagAccountString[4].unpack('C')[0]
Em 1.8.6 eu consigoException undefined method
desempacotar 'para 0: Fixnum processando dados de tag buffer principal - saída' O código a seguir funciona (com minha solução proposta) em ambos os ambientes.self.status = tagAccountString[4].ord
Qualquer conselho (por exemplo, uma solução melhor) é mais que bemtagAccountString[4]
retorna uma String em Rubies mais recentes, mas costumava retornar um Fixnum no Ruby 1.8. É por isso que você viu o erroundefined method unpack for 0:Fixnum
,. Você pode usarstatus = tagAccountString[4,1].unpack('C')[0]
ou mesmostatus, = tagAccountString.unpack('xxxxC')
se quiser sempre ignorar quatro caracteres e converter o próximo.