In vielen Sprachen gibt es zwei Funktionen chr()
und ord()
, die zwischen Zahlen und Zeichenwerten konvertieren. In einigen Sprachen ord()
heißt asc()
.
Ruby hat Integer#chr
, was super funktioniert:
>> 65.chr
A
Meinetwegen. Aber wie gehst du in die andere Richtung?
"A".each_byte do |byte|
puts byte
end
Drucke:
65
und das ist ziemlich nah an dem, was ich will. Aber ich würde eine Schleife wirklich lieber vermeiden - ich suche etwas, das kurz genug ist, um bei der Deklaration von a lesbar zu sein const
.
Versuchen:
quelle
Ich möchte +1 Dylanfm und AShellys Kommentar, aber füge die [0] hinzu:
'A'.unpack('C')[0]
Der Entpackungsaufruf gibt ein Array zurück, das eine einzelne Ganzzahl enthält. Dies wird nicht immer akzeptiert, wenn eine Ganzzahl gewünscht wird:
Ich versuche, Code zu schreiben, der unter Ruby 1.8.1, 1.8.7 und 1.9.2 funktioniert.
Bearbeitet, um C zum Entpacken in Großbuchstaben zu übergeben, da Entpacken ("c") -1 ergibt, wobei ord () 255 ergibt (obwohl es auf einer Plattform ausgeführt wird, auf der Cs Zeichen signiert ist).
quelle
Ich bin gerade darauf gestoßen, als ich eine reine Ruby-Version von Stringprep über RFCs zusammengestellt habe.
chr
Beachten Sie, dass dies außerhalb von [0,255] fehlschlägt. Verwenden Sie stattdessen tragbare Ersatzteile 1.9.x - 2.1.x:quelle
char
und ihre Umkehrung im Fall von Unicode richtigWenn Sie das Zeichen in einer Zeichenfolge haben und es ohne Schleife dekodieren möchten:
quelle
Wie wäre es mit
quelle
Sie können diese haben:
quelle
Wenn es Ihnen nichts ausmacht, die Werte aus einem Array zu ziehen, können Sie verwenden
"A".bytes
quelle
Ich schreibe Code für 1.8.6 und 1.9.3 und konnte keine dieser Lösungen in beiden Umgebungen zum Laufen bringen :(
Ich bin jedoch auf eine andere Lösung gestoßen : http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Das hat auch bei mir nicht funktioniert, aber ich habe es für meinen Gebrauch angepasst:
Nachdem dies geschehen ist, funktioniert das Folgende in beiden Umgebungen
quelle
"A".unpack("C")[0]
, zielte dies auf Ruby 1.8.1, Ruby 1.8.7 und Ruby 1.9.2 ab. Schlägt es in Ihrer Umgebung fehl? Was für ein Fehler?self.status = tagAccountString[4].unpack('C')[0]
In 1.8.6Exception undefined method
entpacke ich 'für 0: Fixnum verarbeitet gepufferte Haupt-Tag-Daten - exit` Der folgende Code funktioniert (mit meiner vorgeschlagenen Lösung) in beiden Umgebungen.self.status = tagAccountString[4].ord
Jeder Rat (z. B. eine bessere Lösung) ist mehr als willkommentagAccountString[4]
Gibt einen String in neueren Rubinen zurück, wird jedoch verwendet, um ein Fixnum in Ruby 1.8 zurückzugeben. Deshalb haben Sie den Fehler gesehenundefined method unpack for 0:Fixnum
. Sie könnenstatus = tagAccountString[4,1].unpack('C')[0]
oder sogar verwenden,status, = tagAccountString.unpack('xxxxC')
wenn Sie immer vier Zeichen ignorieren und das nächste konvertieren möchten.