Visual Works smalltalk,如何将Ascii值转换为字符

时间:2015-07-22 21:25:58

标签: ascii smalltalk visualworks

使用visualworks,在小谈话中,我从网络连接收到类似'31323334'的字符串。

我需要一个读取'1234'的字符串,所以我需要一种方法一次提取两个字符,将它们转换为它们在ascii中表示的字符,然后构建它们的字符串......

有办法吗?

编辑(7月24日):由于某些原因,你们中的许多人都认为我只会使用数字并且可以截断3或者读取所有其他字符。情况并非如此,读取的字符串示例可能包括美国标准键盘上的任何键(a-z,A-Z,0-9,标点符号/注释,例如{} *& ^%$ ...)

3 个答案:

答案 0 :(得分:2)

遵循Max开始提出的建议:

x := '31323334'.
in := ReadStream on: x.
out := WriteStream on: String new.
[ in atEnd ] whileFalse: [ out nextPut: (in next digitValue * 16 + (in next digitValue)) asCharacter ].
newX := out contents.

newX会得到结果'1234'。或者,如果你从:

开始
x := '454647'

您将获得'EFG'的结果。

请注意,digitValue可能只识别大写十六进制数字,因此在处理之前字符串可能需要asUppercase

答案 1 :(得分:0)

通常会有#fold:#reduce:方法让您这样做。在Pharo,还有一条消息#allPairsDo:#groupsOf:atATimeCollect:。使用以下方法之一,您可以:

| collectionOfBytes |
collectionOfBytes := '9798' 
  groupsOf: 2
  atATimeCollect: [ :group |
    (group first digitValue * 10) + (group second digitValue) ].
collectionOfBytes asByteArray asString "--> 'ab'"

Pharo中的#digitValue消息只返回数字字符的数字值。

如果您在流上接收数据,则可以用循环替换#groupsOf:atATime:result可以是您之后转换为上述字符串的任何集合):

...
[ stream atEnd ] whileFalse: [
  result add: (stream next digitValue * 10) + (stream next digitValue) ]
...

答案 2 :(得分:0)

在Smalltalk / X中,有一种方法称为" fromHexBytes:" ByteArray类理解的内容。我不确定,但认为其他ST方言中存在类似的东西。

如果存在,您可以通过以下方式解决此问题:

 (ByteArray fromHexString:'68656C6C6F31323334') asString

反之亦然:

 'hello1234' asByteArray hexPrintString

另一种可能的解决方案是将字符串作为十六进制数字读取, 获取digitBytes(应该给你一个字节数组),然后将其转换为字符串。 即。

(Integer readFrom:'68656C6C6F31323334' radix:16)
    digitBytes asString

有一个问题是我不确定你将获得digitBytes(LSB或MSB)的字节顺序,如果它被定义为跨架构相同或在图像加载时转换为使用本机订购。因此可能需要在最后反转字符串(为了便携,甚至可能需要根据系统的字节顺序有条件地反转它。

我不能在VisualWorks上测试它,但我认为它也应该在那里正常工作。