Во многих языках есть пара функций, chr()
и ord()
, которые преобразуют числа в символьные значения. В некоторых языках ord()
называется asc()
.
Ruby имеет Integer#chr
, который отлично работает:
>> 65.chr
A
Справедливо. Но как пойти другим путем?
"A".each_byte do |byte|
puts byte
end
печатает:
65
и это довольно близко к тому, что я хочу. Но я бы предпочел избежать цикла - я ищу что-то достаточно короткое, чтобы его можно было прочитать при объявлении const
.
Пытаться:
источник
Я хотел бы +1 к комментарию dylanfm и AShelly, но добавить [0]:
'A'.unpack('C')[0]
Вызов unpack возвращает массив, содержащий одно целое число, которое не всегда принимается там, где требуется целое число:
Я пытаюсь написать код, работающий на Ruby 1.8.1, 1.8.7 и 1.9.2.
Отредактировано, чтобы передать C для распаковки в верхнем регистре, потому что unpack ("c") дает мне -1, где ord () дает мне 255 (несмотря на то, что он работает на платформе, где C подписан char).
источник
Только что наткнулся на это, когда собирал чистую версию Stringprep на Ruby через RFC.
Остерегайтесь того, что
chr
выходит из строя за пределами [0,255], вместо этого используйте переносимые замены 1.9.x - 2.1.x:источник
char
и его обратный в случае Unicode правильноКроме того, если у вас есть символ в строке и вы хотите декодировать его без цикла:
источник
Как насчет
источник
У вас могут быть такие:
источник
Если вы не против вытащить значения из массива, вы можете использовать
"A".bytes
источник
Я пишу код для 1.8.6 и 1.9.3, и мне не удалось заставить ни одно из этих решений работать в обеих средах :(
Однако я столкнулся с другим решением: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
У меня это тоже не сработало, но я адаптировал его для себя:
После этого в обеих средах будет работать следующее:
источник
"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
unpack 'для 0: Fixnum обрабатывает данные основного буферизованного тега - exit` Следующий код работает (с моим предложенным решением) в обеих средах.self.status = tagAccountString[4].ord
Любые советы (например, лучшее решение) более чем приветствуютсяtagAccountString[4]
возвращает String в новых Ruby, но используется для возврата Fixnum в Ruby 1.8. Вот почему вы увидели ошибкуundefined method unpack for 0:Fixnum
. Вы можете использоватьstatus = tagAccountString[4,1].unpack('C')[0]
или дажеstatus, = tagAccountString.unpack('xxxxC')
если вы всегда хотите игнорировать четыре символа и преобразовать следующий.