使用visualworks,在小谈话中,我从网络连接收到类似'31323334'的字符串。
我需要一个读取'1234'的字符串,所以我需要一种方法一次提取两个字符,将它们转换为它们在ascii中表示的字符,然后构建它们的字符串......
有办法吗?
编辑(7月24日):由于某些原因,你们中的许多人都认为我只会使用数字并且可以截断3或者读取所有其他字符。情况并非如此,读取的字符串示例可能包括美国标准键盘上的任何键(a-z,A-Z,0-9,标点符号/注释,例如{} *& ^%$ ...)答案 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上测试它,但我认为它也应该在那里正常工作。