【问题标题】:Converting a string and an integer to a hex in smalltalk在 smalltalk 中将字符串和整数转换为十六进制
【发布时间】:2014-04-16 20:41:01
【问题描述】:

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 从一个 diff 程序中检索到的,因此我无法控制我收到的格式......我需要发回一个字符串以便处理通信,这无济于事连接

【问题讨论】:

    标签: string hex smalltalk visualworks


    【解决方案1】:

    在 Pharo(如果我没记错的话,还有 Squeak)中,您可以使用 Integer 的类端 #readFrom:base: 方法:Integer readFrom: self stringToMakeHex base: 16。 在'F' 的情况下,这会给你一个整数值15

    如果我是你,我会将阅读和打印封装在一个新类中,例如HexString。您可以在类端实现on:,在实例端实现+-printOn:

    更新:

    要从特定基数中的整数获取String,请使用#printStringBase:(在Pharo 中)或#printOn:base:(可能更便携),如下所示:12 printStringBase: 16。计算结果为 'C'

    【讨论】:

    • +1 创建一个执行 Hex-stuff 的类。在 VisualWorks 中,如果要将整数打印为十六进制,可以使用 #printOn:base:。要从十六进制字符串中读取整数,您需要在 VisualWorks 中使用 #readFrom:radix:。要实现十六进制类,您应该继承整数,因为十六进制数仍然是整数,您可以免费获得所有算术。
    • 好的,那么我如何获得一个字符串作为最终产品呢?假设我在“F”中读取转换为 15 的值,减去 5,剩下 10。我如何获得“A”
    【解决方案2】:

    试试这个:

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

    转换回来:

    (sum printStringRadix: 16) 
    

    【讨论】:

    • 这是最好的答案,又快又简洁。像魅力一样工作
    猜你喜欢
    • 2015-04-30
    • 2015-11-29
    • 2017-08-12
    • 2014-12-15
    • 2013-12-07
    相关资源
    最近更新 更多