2

visualworks を使用して、世間話でネットワーク接続から「31323334」のような文字列を受信して​​います。

「1234」を読み取る文字列が必要なので、一度に 2 文字を抽出し、それらを ascii で表すものに変換してから、それらの文字列を作成する方法が必要です...

そうする方法はありますか?

EDIT(7/24):何らかの理由で、あなたの多くは、私が数字だけを扱い、3を切り捨てるか、1文字おきに読み取ることができると想定しています。これは当てはまりません。読み取られる文字列の例には、米国標準キーボードの任意のキー (az、AZ、0-9、{}*&^%$ などの句読点/注釈など) が含まれる可能性があります。

4

3 に答える 3

2

マックスが提案し始めたことの行に沿って:

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は大文字の 16 進数しか認識しない可能性があるため、asUppercase処理前に文字列に が必要になる場合があることに注意してください。

于 2015-07-23T19:24:11.420 に答える
0

Smalltalk/X にはfromHexBytes:、ByteArray クラスが理解する " " というメソッドがあります。確かではありませんが、他の ST 方言にも似たようなものがあると思います。

存在する場合は、次の方法でこれを解決できます。

 (ByteArray fromHexString:'68656C6C6F31323334') asString

逆は次のようになります。

 'hello1234' asByteArray hexPrintString

もう 1 つの解決策として、文字列を 16 進数として読み取り、digitBytes (バイト配列を取得する必要があります) を取得してから、それを文字列に変換する方法があります。いえ

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

これに関する 1 つの問題は、どのバイト順で digitBytes (LSB または MSB) を取得するのか、また、それがアーキテクチャ間で同じになるように定義されているか、画像の読み込み時に変換されてネイティブの順序を使用するかどうかがわからないことです。そのため、最後に文字列を逆にする必要がある場合があります (システムのエンディアンによっては、移植可能にするために、条件付きで文字列を逆にする必要がある場合もあります。

これを VisualWorks でテストすることはできませんが、そこでも問題なく動作するはずです。

于 2015-08-15T12:07:17.653 に答える
0

通常、それを可能にする#fold:or#reduce:メソッドがあります。Pharo には、メッセージ#allPairsDo:#groupsOf:atATimeCollect:. これらの方法のいずれかを使用して、次のことができます。

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

#digitValuePharoのメッセージは、数字の桁の値を返すだけです。

#groupsOf:atATime:ストリームでデータを受信して​​いる場合は、ループに置き換えることができます (result上記のように文字列に変換する任意のコレクションである可能性があります)。

...
[ stream atEnd ] whileFalse: [
  result add: (stream next digitValue * 10) + (stream next digitValue) ]
...
于 2015-07-23T04:58:30.513 に答える