Преобразование строки и целого числа в шестнадцатеричный в smalltalk

TL;DR: как преобразовать целые числа в шестнадцатеричные, а также как преобразовать строку из 1 символа в шестнадцатеричный (например, 'F' -> 0xF )

хотите преобразовать символ в шестнадцатеричное значение, сделайте некоторую математику, а затем преобразуйте обратно в символ.

поэтому у меня есть что-то вроде этого:

addBits: aValue move: action
"aValue is always either 5 or 10 (0xA)"
"move is either 'a' for add or 's' for subtract"

|sum conversion|

"self stringToMakeHex is the string, it's always either an 'F', 'A', '0', 
or '5' I need to turn it into either 0xF,0xA,0x0,or 0x5"
conversion := (self stringToMakeHex) asInteger.

(action = 's')
ifTrue:[sum:= conversion - aValue.]
ifFalse:[sum:=conversion + aValue.].

stringToMakeHex: (sum asString).

Я знаю, что не должен делать asInteger, поскольку он каким-то образом преобразует «F» в ноль, поэтому мне интересно, есть ли хороший способ получить из него 0xF или даже 15. Моя другая проблема заключается в том, что aValue поступает как целое число (5 и 10 с основанием 10), поэтому мне нужен способ получить шестнадцатеричные значения 0x5 и 0xA.

Все эти данные извлекаются через TCP / IP из программы сравнения, поэтому я не могу контролировать, какой формат я получаю ... Не помогает то, что мне нужно отправить строку обратно, чтобы связь обрабатывалась через соединение


person Medic3000    schedule 16.04.2014    source источник


Ответы (2)


Попробуй это:

(Compiler evaluate: '16r', self stringToMakeHex)

Чтобы конвертировать обратно:

(sum printStringRadix: 16) 
person David Buck    schedule 17.04.2014
comment
Это был лучший ответ, быстрый и лаконичный. работал как шарм - person Medic3000; 17.04.2014

В Pharo (и Squeak, если я не ошибаюсь) вы можете использовать метод #readFrom:base: на стороне класса для Integer: Integer readFrom: self stringToMakeHex base: 16. Это дает вам целое значение 15 в случае 'F'.

Если бы я был вами, я бы инкапсулировал чтение и печать в новый класс, например. HexString. Вы можете реализовать on: на стороне класса и +, - и printOn: на стороне экземпляра.

Обновлять:

Чтобы получить String из целого числа в определенной базе, используйте #printStringBase: (в Pharo) или #printOn:base: (что, вероятно, более переносимо), например: 12 printStringBase: 16. Это оценивается как 'C'.

person Max Leske    schedule 17.04.2014
comment
+1 при создании класса, который делает шестнадцатеричные вещи. В VisualWorks, если вы хотите напечатать целое число в шестнадцатеричном виде, вы можете использовать #printOn:base:. Чтобы прочитать целое число из шестнадцатеричной строки, вам нужно использовать #readFrom:radix: в VisualWorks. Чтобы реализовать шестнадцатеричный класс, вы должны подклассировать Integer, потому что Hex-Number по-прежнему является целым числом, и вы получаете всю арифметику бесплатно. - person Karsten; 17.04.2014
comment
Хорошо, а как тогда мне получить строку в качестве конечного продукта? скажем, я прочитал в «F» преобразование в значение 15, вычесть 5, и у меня осталось 10. как мне получить «A» - person Medic3000; 17.04.2014