在smalltalk中将字符串和整数转换为十六进制

时间:2014-04-16 20:41:02

标签: string hex smalltalk visualworks

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 base10),所以我需要一种方法来获得十六进制值0x5和0xA。

所有这些数据都是通过TCP / IP从dif程序中检索出来的,所以我不能控制我接收的格式...没有帮助我需要发回一个字符串才能在整个过程中处理通信连接

2 个答案:

答案 0 :(得分:4)

在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'

答案 1 :(得分:1)

试试这个:

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

转换回来:

(sum printStringRadix: 16)